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

タグ: Laravel3  

ルートに名前をつけることは、以下の利点があります。

  • ルートの変更でも、URLの生成、リンクの生成コードを変更しなくて済む。
  • ワイルドカードを使用したURLの生成、リンクの生成が楽になる。

ルートに名前を付け、その名前でURLやリンクを生成しておけば、例えばname/get/(:num)name/(:num)に変更しても、コードの変更はありません。(ワイルドカードの変更をした場合は変更する必要はでます。)

リンクの生成時、ルーティングの指定にワイルドカードが含まれている場合、それらはプレースホルダーとして働きます。埋め込む値を配列で渡すことで順番に埋め込まれたURLやリンクが生成されます。例えば、take/(:any)/(:num)であれば、array('xml',9)を指定することで、take/xml/9として生成されます。

では、ルートの定義を見てみましょう。

// ワイルドカード無し
Route::get('test/sample', array('as' => 'sample', function() {
    return 'hello';
}));

// ワイルドカード使用
Route::any('task/(:num)', array('as' => 'task', function($task_id) {
    // タスクの取得など
    return view('task_view')->with('tasks', $data );
}));

// オプション指定を含む場合
Route::any('post/(:num)/(:all?)', array('as' => 'post', function($post_id, $slug = null) {
    // 記事の取得処理など
    return view('postview')->with('posts', $data );
}));

2番目の引数を配列にし、キーにasを使用し、ルート名を指定します。

URLの生成は次のようになります。

// URLクラス使用
URL::to_route('sample')
// ヘルパー使用
route('sample')

// ワイルドカード(プレイスホルダー)の置き換え
route('task', array($task_id)
route('post', array($post_id)
route('post', array($post_id, Str::slug($title))

配列で渡す要素の数により、URLが切り分けて生成されます。

リンクの生成をご覧ください。

// 通常、ビューの中で
echo HTML::link_to_route('sample', 'サンプル表示');
// リンクにidを連結
echo HTML::link_to_route('task', "タスク($task_id)表示", array($task_id));
// 属性を指定する場合
echo HTML::link_to_route('task', "タスク($task_id)表示", array($task_id), array('class'=>'tasklink'));
// タイトルをリンク対象
echo HTML::link_to_route('post', $title, array($post_id));
// スラグをリンクに含める
echo HTML::link_to_route('post', $title, array($post_id, Str::slug($title)));
// 日本語スラグをリンクに含める
echo HTML::link_to_route('post', $title, array($post_id, urlencode($title)));
// 更に属性を指定
echo HTML::link_to_route('post', $title, array($post_id, urlencode($title)), array('id'=>'titlelinke'));