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'));