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

参照:ルーティング定義2(名前付きルート)