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'で名前をつけ、つけた名前でリンクを生成したほうが保守性は高くなります。