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行のすっきりしたコードになった。コントローラの理解についてはもう少し続ける予定です。それではまた!!