Laravelの続きです。前回はルーティングファイルでページ生成、パラメータ読み込みをしました。今回は「MVCアーキテクチャ」の「C」にあたる「コントローラ」を理解する。それではいきましょう!!
【目次】
※前回:【Laravel】ルーティングファイル(routesディレクトリのweb.php)にページを直書きしてみる - クモのようにコツコツと
MVCとは何か
MVCとは何か。Mはモデル(Model)、Vはビュー(View)、C(Controller)はコントローラ。習得中の書籍「Laravel入門」によれば…
- モデル(Model):データ処理全般を担当。DBにアクセスする処理全般
- ビュー(View):画面表示を担当。表示に使うテンプレートに相当
- コントローラ(Controller):全体の制御。必要に応じてMでデータを取得したりVで画面を表示したり
※参考:Laravel入門
今回の主役、コントローラ(C)って文字通り指揮者みたいね。
以前の記事でLaravelのファイル構成を見た時に開いたwelcome.blade.phpというファイル。このファイルがある場所は/resources/views/だった。このviewsはMVCのビュー(V)であると予想。
※参考:Laravelの/publicをルートに変更しHello worldする - クモのようにコツコツと
残るモデル(M)はDB絡みなので今後改めて見ていきたい。
コントローラ(C)を作る
それでは引き続き「Lara入」を参考に進めていく。
まずターミナルを開いてcdコマンドでLaravelのディレクトリに移動。私の場合MAMPなのでこんな感じ
$ cd /Applications/MAMP/htdocs/hoge
laravelのartisanコマンドでコントローラを作ると初期のテンプレート状態になっている。
$ php artisan make:controller HelloController
make:controllerはコントローラを作るコマンド。HelloControllerはコントローラ名。実行すると「成功したよ!」という文字が!
Controller created successfully.
ファイルができたか見てみる。/app/Http/Controllers/ディレクトリを開くとHelloController.phpというファイルができていた!!
HelloController.phpを開いてみるとこんなコードが
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { // }
- 名前空間
namespaceはApp\Http\Controllersに配置されている。 Illuminate\Http\パッケージ内にあるRequestを使える状態に(use文)HelloControllerクラスを定義。Controllerクラスを継承(extends)
名前空間てカッコいい名前!範囲は先ほど見にいったディレクトリだ。
名前空間とは、文字通り名前の空間のことで、ここからここまでのコードが○○という空間に属していると定めることができます。 空間が違えば、同じ関数名を定義して使うことができます。
あと、バックスラッシュがでてきた。
名前空間に属する関数を呼ぶときは、○○の名前空間にある関数だよと記述する必要があります。 最初に名前空間名を記述した後に \ (バックスラッシュ)を記述し、その後に関数名を記述します。 バックスラッシュは、円記号で入力できます。
use文とは?
use キーワードを使うことで、名前空間などをインポートしたり、エイリアスを作成することができます。
※参考:【PHP超入門】名前空間(namespace・use)について - Qiita
アクション(処理)を追加
コントローラにアクション(処理)を追加する。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { // rainenメソッド public function rainen($nen='何', $kumi='何', $sensei='誰') { return <<<EOF <html> <head> <meta charset="utf-8"/> <title>コントローラ</title> <style> * {font-family: sans-serif; color: #666; box-sizing: border-box;} section {width: 100%; max-width: 600px; margin: 0 auto; padding: 0 20px; border: 1px solid #ccc;} h1 {border-bottom: 1px solid #ccc; padding: 0 0 10px;} </style> </head> <body> <section> <h1>コントローラ</h1> <p>このページはLaravelの「/app/Http/Controllers/」ディレクトリの中の「HelloController.php」の中に書いたrainenクラスを読み込んでいる。</p> <p>複数のパラメータを読み込んで表示してみる。</p> <p>あなたの来年のクラスは「{$nen}年{$kumi}組」、担任は「{$sensei}先生」です!</p> </section> </body> </html> EOF; } }
HelloControllerクラスの波カッコの中にアクションを書くrainenメソッドを定義。引数は3つで$nen、$kumi、$sensei。「何」など引数がない場合の代替文字も設定。rainenメソッドの中、ヒアドキュメントEOFを返す。- ヒアドキュメント
EOFの中のHTMLに{$nen}などの引数のワードが含まれている。
見ての通り、前回の記事と同じような内容です。複数のパスを読み込む設定。
メソッドの頭にあるpublicは「アクセス修飾子」。どこからでもアクセス可能。
※参考:PHPのアクセス修飾子public, protected, privateの違い | UX MILK
なお、ヒアドキュメントEOF;のあとに余計な文字があるとsyntax errorになった。行下げのスペースやタブでもダメみたい。この質問が参考になった。
※参考:PHP - phpで謎の構文エラー|teratail
ルートを割り当てる
アクションを実行するために、ルートを割り当てる。/routesディレクトリのweb.phpを開く。
ルートを追記。
<?php //コントローラ(rainenクラス) Route::get('rainen/{nen?}/{kumi?}/{sensei?}', 'HelloController@rainen');
パスrainenでHelloControllerのrainenクラスを実行。nen、kumi、senseiのパスを読み込んでページ上に表示してくれるはず。
ルーティングについても前回の記事を参照。今回はコントローラ名、クラス名を指定しているだけで随分すっきり♪
※参考:【Laravel】ルーティングファイル(routesディレクトリのweb.php)にページを直書きしてみる - クモのようにコツコツと
ページを開いてみる(金八先生の表示!)
ちゃんとページが生成されるか開いてみる。ドキドキ…。
※参考:https://vast-meadow-11880.herokuapp.com/rainen
やた!表示された!!「何」「誰」などもちゃんと表示されている。
パスを追加してみる。/3/B/金八ね。どうか?
※参考:https://vast-meadow-11880.herokuapp.com/rainen/3/B/金八
やったった!「3年B組金八先生」になった♪
最後に
ということで前回のルーティングの最後の「3年B組金八先生」表示をコントローラで再現しました。それによってルーティングの方は1行のすっきりしたコードになった。コントローラの理解についてはもう少し続ける予定です。それではまた!!