前回投稿から3ヶ月、その間にW杯も終わり、夏も終わってしまいました。
ドイツが優勝候補筆頭だよ、ノイアー神が居るからだよ、と周囲に吹聴していた私はW杯決勝の後さんざんドヤ顔しましたが、またここに書きながらドヤ顔してます。
さて、前回「ルーティング編」ではLaravelのルーティング、つまりURLと処理の紐付けについてそれなりに詳しく書いてみましたが、今回はいよいよ本丸に突入しますよ。
「次回はコントローラ・ビュー編」というようなことを書いておりましたが、この2つを纏めるのは欲張りすぎなので、この記事ではコントローラに絞って書かせていただきます。
前回の「MVCパターンとは」の項で書いたとおり、Laravel(及び一般的なPHPフレームワーク)の三大構成要素のひとつがコントローラです。
Controller/コントローラ:内部処理。リクエストされたURIやフォームの入力値にしたがって、何かしらの処理をする。主役。
コントローラは処理の主役であり、でも表には出てこない縁の下の力持ちでもあります。 ざっくり乱暴に分けるなら、直接表示に関わる処理(ビュー)でもなく、DBとPHPとの橋渡しをする処理(モデル)でもなければコントローラ、ということになります。
Laravelのプロジェクトディレクトリの中で、コントローラは以下の場所に設置します。※1
app/controllers
ここにコントローラとして動かすphpを置くのですが、ファイル名の規則としては"HogeController.php"という形にします。
恐らく初期状態では "HomeController.php" というサンプルファイルが置いてあると思います。
処理を書いて設置したなら、あとは前回のルーティング編に書いたようなルーティング設定をすれば早速動いてくれるはずです。
app/routes.php
// app/controllers/HomeController.phpが設置してあり、以下のようなルーティングが書かれていれば、 // ベースURLにアクセスするとHomeController.phpが動く Route::get('/', 'HomeController@index');
※1 本当はどこに置いてもコントローラとして動かすことはできるのだけど、敢えてルールを破る必要もない気がします。
では肝心のコントローラの中身についてです。
始めに同梱されている"HomeController.php"を見てみます。
app/controllers/HomeController.php
<?php class HomeController extends BaseController { public function index() { return View::make('index'); } } ?>
まずポイントは "extends BaseController" の部分。BaseControllerがLaravel4に用意されたコントローラクラスなので、それを拡張していきます。 extendsを忘れたら、当然Laravelのコントローラとして動作させることはできません。
"public function index()"の部分は見ての通りメソッド名ですね。
ひとつ前の項で書いた
Route::get('/', 'HomeController@index');
というルーティングが設定されていたなら、プロジェクトのベースURLにアクセスされたときにHomeController.phpのindex()に書かれた処理が走る、ということです。
ここまで分かれば、後は上記を参考に index() とか hoge() の中に好き勝手処理を書いていけばOK。
サンプルのHomeControllerでは表示処理はViewに渡していますが、直接コントローラの中にhtmlを書いても動くし、デバッグする場合はこの中で var_dump() とかしちゃっても問題ないです。
前回もちらっとフィルター処理について書きましたが、コントローラ側にフィルターを書くことだってもちろんできます。
app/controllers/HomeController.php
<?php class HomeController extends BaseController { public function __construct() { $this->beforeFilter('auth', array('except' => 'getLogin')); } public function index() { return View::make('index'); } } ?>
こんな感じです。
authフィルターはログインチェックをするためにあらかじめ用意されているフィルターで、上記の処理は最初にauthフィルターでログインチェック。もしログインしていなければLoginページに飛ばすという処理をコンストラクタで行っているわけです。
コントローラでは何をやっても(設計としての合理性を無視すれば)問題ないのですが、中でも書く頻度の高そうな処理の例を挙げていきます。
Inputクラスを使えば簡単にgetやpostからデータを受け取れるし、Cookieクラスを使えばクッキーを焼くのも簡単です。
参考:リクエストと入力
// nameの値を取得 $name = Input::get('name'); // すべての入力値を取得(配列) $input = Input::all(); // 入力値をクリア Input::flash(); // ひとつのクッキーの値を取得 $value = Cookie::get('name'); // 新たにクッキーを焼く $response = Response::make('Hello World'); $response->withCookie(Cookie::make('name', 'value', $minutes));
いよいよ画面に出力というときは、Viewクラスでビューを呼び出します。変数も一緒に好きなだけ渡すことができます。
他のURLにリダイレクトさせたいときはRedirectクラスを使います。
参考:ビューとレスポンス
// greetingビューを表示する return View::make('greeting'); // greetingビューに名前データを渡して表示する return View::make('greeting', array('name' => 'Taylor')); // ログイン画面に飛ばす return Redirect::to('user/login'); // エラーメッセージと共にログイン画面に飛ばす return Redirect::to('user/login')->with('message', 'Login Failed');
上記に挙げたのはほんの僅かな例なので、やりたいことに応じてクイックスタートとにらめっこするのが一番です。
今回のコントローラ編の説明は割とサラッと済ませてしまいましたが、ルーティング、コントローラまで来れば、あとは表示系(ビュー)が出来ればちょっとした一連の処理ができることになりますね。
Laravelのビューには "Blade" というイケてるテンプレートエンジンが含まれているので、コーディングもサクサク進められるようになっています。
そしてMVCの最後の要素、Modelも残っていることも考えると、このシリーズはまだまだ続きそうです。ベル○ルクより先に完結できるよう頑張ります。
待て次号!