WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
ルートフィルター

ルートフィルター

このエントリーをはてなブックマークに追加

ルートフィルターとは、ルートへのアクセス制限(フィルター)を行うための定義ファイルです。Laravel3では、ルートフィルターは、routes.phpの中に定義されていましたが、Laravel4では、ルートフィルターは別ファイルとして作成されています。実行ファイルの概略を見れば分かるとおり、routes.phpが読み込まれる前に、fileters.phpは読み込まれています。

それでは、デフォルトのfilters.phpを開いてみましょう。※尚、本日2013年5月1日時点で、Laravel4は、まだベータ版ですので、実際にリリースされる頃には、修正されているかもしれません。

<?php
App::before(function($request)
{
//
});

App::after(function($request, $response)
{
//
});

Route::filter('auth', function()
{
if (Auth::guest()) return Redirect::route('login');
});

Route::filter('auth.basic', function()
{
return Auth::basic();
});

Route::filter('guest', function()
{
if (Auth::check()) return Redirect::to('/');
});

Route::filter('csrf', function()
{
if (Session::token() != Input::get('_token'))
{
throw new Illuminate\Session\TokenMismatchException;
}
});

ルートフィルターを定義する

ルートフィルターは下記のように定義します。

Route::filter(フィルター名,function(){フィルター条件});

それでは、実際に定義してみます。

Route::filter('old',function(){
if(Input::get('age') < 200){
return Redirect::to('home');
}
});

上記例では、フォームから送信されたageフィールドの値が200以下なら、homeと命名された名前付きルートへリダイレクトするようにold名のフィルターを作成しています。

尚、フィルターの中でレスポンスがリターンされた場合、そのレスポンスによりリクエストは処理済みと見なされ、ルートで指定した処理は実行されず、afterフィルターの処理もキャンセルされます。

ルートにフィルターを適用する

ルートにフィルターを適用するには、下記のようにします。

Route::get(URI,array(‘before’=>フィルター名,function(){実行コード}));

ルーターが第1引数にURIを指定すると、第2引数の指定したフィルターを適用後、無名関数を処理します。

実際にフィルターを適用してみます。

Route::get('user',array('before'=>'old',function(){
return 'あなたの年齢は200歳以上です!;
}));

上記例では、ルーターがhttp://localhost/laravel4/public/userにアクセスした場合、oldフィルターが適用され、oldフィルターの条件をクリアできなかった場合に、「あなたの年齢は200歳以上です」と文字列を返します。

複数のフィルターを適用する

複数のフィルターを、フィルター名とフィルター名を | で挟むことで同時に指定することが出来ます。

Route::get('user',array('before' => 'auth|old',function(){
return 'あなたは認証され、そして200歳以上です!';
}));

ちょっと日本語がおかしいですけれどご勘弁を。

フィルターパラメーターを指定する

Route::filter('age',function($route,$request,$value){
//フィルターを作成
});
Route::get('user',array('before' => 'age:200',function(){
return 'Hello World!';
}));

パターンフィルター

URIを元にしたルート全体にフィルターを適用することも出来ます。

Route::filter('admin',function(){
//条件が合えばadmin専用ページへ移動
});

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

上記例では、adminフィルターがadmin/で始まる全てのルートに適用されます。アスタリスクはワイルドカード*として取り扱われ、全ての文字と結びつけられます。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です