Laravel3:ルーティング定義3(コントローラー)
タグ: Laravel3
コントローラーを使用する場合、他のフレームワークでも標準的に採用されているデフォルトのコントローラー/アクション/引数1/...
のルートで呼び出す方法と、ルートとコントローラー/アクションを一つ一つ定義する方法が取れます。
Laravelでは、他のフレームワークのように、デフォルトではこの形式のルーティングが行われません。以下の方法で対象のコントローラーを指定する必要があります。
まとめて指定する
コントローラーに含まれているアクションをまとめて指定するにはcontorllerメソッドを使用します。
// 一つ指定 Route::controller('post'); // 複数指定 Route::controller(array('post', 'tag'));
もし、application/controllers
下の全コントローラーを指定したい場合は以下のコードです。
Route::controller(Controller::detect());
ただしドキュメントにも書かれていますが、この方法ではコントローラーのロード順序などが指定できません。(出力順序がOSの文字列の比較順序に依存されるからだそうです。)
さらにcontrollerメソッドを使用して指定する場合、routes.phpを読むだけで、全ルートを把握できません。保守性と可読性を上げるために、全ルートを一つ一つ定義することをおすすめします。この定義方法は、プロトタイプをさくっと作成したい場合などに活用しましょう。大きめのプロジェクトでは当然使うべきでないでしょう。
アクションに対する個別のルートを定義
コントローラー/アクションに対して一つ一つルートを定義することもできます。保守性・可読性が上がります。
ルート定義をご覧ください。
// ワイルドカード無し Route::get('test/sample', array('uses' => 'test@sample')); // ワイルドカード使用 Route::get('task/(:num)', array('uses' => 'task@show')); Route::any('task/edit/(:num)', array('uses' => 'task@edit')); // オプション指定を含む場合 Route::get('post/(:num)/(:all?)', array('uses' => 'post@display'));
無名関数で指定していた実行コードはコントローラー中に書かれますので、すっきりします。名前の定義の代わりに、'uses'キーを使用し、コントローラー/アクションを定義しています。
コントローラー名@アクション名
です。at
という英単語の意味合いからすると順番が逆ですが、単なる記号として考えてください。
この例の場合のコントローラー側のコードは、次のような形になります。
// application/controllers/test.php class Test_Controller extends Base_Controller { function action_sample() { return view('test.sample-view'); } } // application/controllers/task.php class Task_Controller extends Base_Controller { $restful = true; function get_show($id) { // タスク情報の読み込み return view('task.show-view', $data); } function get_edit($id) { // タスク情報の読み込みなど return view('task.edit-view', $data); } function post_edit($id) { // フォームの処理 return Redirect::to_action('task@edit') ->with_intpu() ->with_error($validator); } } // application/controllers/post.php class Post_Controller extends Base_Controller { $restful = true; function get_display($id, $slug = null) { // 記事の取得処理など return view('post.display-view', $data); }
では、URLの生成を見てみましょう。
// URLクラス使用 URL::to_action('test@sample') // ヘルパー使用 action('test@sample') // ワイルドカードの置き換え action('task@show', array($task_id)) action('post@display', array($post_id)) action('post@display', array($post_id, Str::slug($title))
続いて、リンクの生成です。
// 通常、ビューの中で echo HTML::link_to_action('home@sample', 'サンプル表示'); // リンクにidを連結 echo HTML::link_to_action('task@show', "タスク($task_id)表示", array($task_id)); // 属性を指定する場合 echo HTML::link_to_action('task@show', "タスク($task_id)表示", array($task_id), array('class'=>'tasklink')); // タイトルをリンク対象 echo HTML::link_to_action('post@display', $title, array($post_id)); // スラグをリンクに含める echo HTML::link_to_action('post@display', $title, array($post_id, Str::slug($title)));
コントローラー/アクション名でルートを定義した場合、その名前自身を変更すると、URLやリンクの生成コードを変更する必要が出てきます。そのため'as'で名前をつけ、つけた名前でリンクを生成したほうが保守性は高くなります。