Laravel4のルーティング

今日は、Laravel4のルーティングについて調べてみたいと思います。Laravel3からどのように変更になったのかも併せて調べてみたいと思います。

1. ルーティング用のファイル(routes.php)は、appフォルダ内にあります。Laravel3のapplicationフォルダ名がappに変更になっていますので、実質的な場所は変わりありませんが、間違わないようにしましょう。

基本的なルーティング

2. 早速、routtes.phpを開いてみてみましょう。Laravel4では、ルートフォルダのみが定義されています。つまり、app/viewsフォルダ内のhello.phpファイルを表示しています。

laravel4/app/routes.php

<?php
 Route::get('/', function()
 {
 return View::make('hello');
 });

3. 基本的なルーティングに関しては、Laravel3とほとんど変わりはありません。ただ、Laravel3でroutes.php内に定義されていたフィルターがLaravel4では、同じappフォルダ内にfilters.phpとして別ファイルで定義するようになっています。

ルートパラメーター

4. Laravel4からルートパラメーターの指定方法が変更になっています。下記にLaravel3とLarave4の違いを記述してみます。

//Laravel3の場合
Route::get('user/(:num)',function($id)
{
  return 'User'.$id;
});
//Laravel4の場合
Route::get('user/{id}',function($id)
{
  return 'User'.$id;
});

Laravel3の場合は、パラメーターによって数字の場合は(:num)、英数字の場合は(:any)、制限なしURIの場合は(:all)で指定していましたが、Larave4lの場合は無名関数の引数と同じ文字列を{}で囲う形式になっています。

オプションのルートパラメーター

5. 無名関数の引数に初期値を指定する場合は、Laravel3と同様にURIセグメントの文字列の最後に?を付与します。

Route::get('user/{name?}',function($name='John')
{
  return $name;
});

上記の場合、URIセグメントに値を指定、たとえばTomと指定すれば、Tomという値が戻りますが、URIセグメントを指定しなければ、Johnという値が戻ります。

正規表現によるルートの束縛

6. URIセグメントを正規表現で束縛することが出来ます。

Route::get('user/{name}',function($name)
 {
 return $name;
 })
 ->where('name','[A-Za-z]+');

上記の場合、getメソッドに、チェーンメソッドのwhereを指定することで、URIセグメントはアルファベットに限定されます。尚、アルファベット以外の文字が使用された場合エラーが表示されますので、エラー処理も考慮してコードを記述してください。

ルートフィルター

7. 上記の3.でも述べたようにLaravel3では、routes.php内に定義されていたルートフィルターが、Laravel4では、filters.php内に定義するように変更されています。

8. それでは、filters.phpの中身を見てみましょう。

<?php
App::before(function($request)
{
 //
});
App::after(function($request, $response)
{
 //
});
Route::filter('auth', function()
{
 if (Auth::guest()) return Redirect::route('login');
});

Route::filter('guest', function()
{
 if (Auth::check()) return Redirect::to('/');
});
Route::filter('csrf', function()
{
 if (Session::getToken() != Input::get('_token'))
 {
 throw new Illuminate\Session\TokenMismatchException;
 }
});
  • 2-9行目までは、アプリケーションフィルターを指定するためのbeforeメソッドと、afterメソッドが用意されています。これは、アプリケーションが起動する前と、起動後に毎回動作させたいプログラムを記述できるようになっています。
  • 10-13行目は、authフィルターが用意されています。つまり、このフィルターは認証されていなければ、ログインルートへリダイレクトします。
  • 15-18行目は、guestフィルターが用意されています。これは、認証されていれば、トップページへリダイレクトします。
  • 19-22行目は、csrfフィルターが定義されています。受け取ったトークンとセッションの保存されているトークンが一致しなければトークンエラーがthrowされます。
  • 21行目は、下記に変更されています(2012/04/16)。
        if (Session::token() != Input::get(‘_token’))

ルートにフィルターを指定する

9. ルートにフィルターを指定するには、Routeクラスのgetメソッドや、postメソッドの第2引数を配列で、下記のように指定します。

Route::get('user',array('before'=>'auth|old',function()
 {
 return 'あなたは認証されていませんし、年齢も適正ではありません!';
 }));

パターンを元にしたフィルター

10. URIをもとしたルート全体にフィルターを適用するには、下記のように作成します。

11. まず、filters.phpに下記のようなフィルターを作成します。

Route::filter('admin',function()
 {
 //ここにadmin用のフィルターを作成します。
 });

Laravel3の場合は、(pattern: URI/*,フィルター名)と定義していました。上記をLaravel3で記述すると下記のようになります。
Route::filter(‘pattern: admin/*’,’admin’);

12. そして、routes.phpに下記のように記述します。

Route::when('admin/*','admin');

このように、URIセグメントにアスタリスクを指定することで、adminフィルターがadmin/で始まるすべてのルートに適用されるようになります。

フィルタークラス

12. フィルターは無名関数の代わりにクラスを使用することも出来ます。フィルタークラスを定義した後で、クラスベースのフィルターを下記のように登録します。

Route::filter('フィルター名,フィルタークラス名);

13. ルートグループや名前付きルートはLaravel3と特に変更は無いと思います。

コントローラルートとバンドルルート

14. Laravel4では、コントローラルートとバンドルルートが廃止されています。これは、パッケージの依存管理にComposerを使用しているのと関係があると思われます。まだ詳しく調べていませんので、詳細は後日ご報告したいと思います。

ルートとモデルの結合

15. Laravel4では、ルートとモデルを結合するためにmodelメソッドという便利なメソッドが作成されています。たとえば、ユーザーIDを受け取る代わりに、そのIDに合致するUserモデルのインスタンスを受け取ることが出来ます。

16. それでは、その方法を見てみましょう。まず最初にRoute::modelメソッドで指定したパラメーターで使用するモデルを指定します。

Route::model('user','User');

17. 次に{user}パラメーターを含んだルートを定義します。

Route::get('pfofile/{user}',function(User $user)
{
//ここにUserモデルのインスタンスを利用したコードが記述できます。
});

今日は、Laravel4のルーティングについて調べてみました。今回は、川瀬裕久氏の翻訳したLaravel4ドキュメント+を元に私なりに解釈した内容を記述いたしました。興味のある方は、是非購入してください。今なら、かなり割安になっています。

https://leanpub.com/laravel4plus

尚、今回は、実際にコードを書いて検証しているわけではありませんので、所々に間違いがあるかもしれませんが、そのときは、後日修正したします。

本日は以上です。

 

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ