非常に明白な何か間違ったことをしていると確信していますが、何らかの理由で、App::before 以外のフィルターをテスト アプリケーションで動作させることができません。
//routes.php
Route::get('site/login',
array(
'before'=>'science',
'as'=>'site/login',
'uses'=>'HomeController@getLogin',
)
);
Route::controller(site, 'HomeController');
//filters.php
App::before(function($request){
//var_dump("Before"); exit;
});
Route::filter('science',function(){
dd("Science B!TCH!");
exit;
});
//HomeController.php
public function getLogin(){
$this->layout->body = View::make('home.login');
}
オブジェクトは最初にユーザーがログインしていないことを確認するためのものだったので、組み込みの「ゲスト」フィルターを使用しようとしましたが、呼び出されませんでした。そのため、後で「科学」フィルターを作成して、任意のルートが機能するかどうかをテストしました。App::before の var_dump 行のコメントを外すと、「Before」と表示され、期待どおりに終了します。
ここで私が間違っていることを誰かが見ることができますか? /site/login ページに移動すると、実際のページではなく、Breaking Bad 映画の引用が表示されます。しかし、ログイン フォームが何事もなかったかのように表示されます。
ありがとう!
更新:ルートを次のように変更しました:
//routes.php
Route::get('site/login', 'HomeController@getLogin')->before('science');
...そしてそれは機能します。画面にデバッグ文字列「SCIENCE ...」が表示されます。
次のようにしても機能します
//HomeController.php
public function __construct(){
$this->beforeFilter('science');
}
ルートの配列バージョンが無視されるユースケースまたは条件はありますか?
更新 2: 元の説明を単純化するために、routes.php にある他のルートを表示するのを怠っていました。以下をご覧ください。
//routes.php
Route::get('site/login',
array(
'before'=>'science',
'as'=>'site/login',
'uses'=>'HomeController@getLogin'
)
);
Route::post('site/login',
array(
'as'=>'site/login',
'uses'=>'HomeController@postLogin'
)
);
GET ルートの後に POST ルートがあることが問題の原因です。POST ルートを GET ルートの前に配置すると、GET ルートはフィルターで期待どおりに機能します。
さて、私は Laravel が GET リクエストと POST リクエストを異なる方法で処理したため、Route で異なる静的メソッドを使用しているという印象を受けました。ただし、後者のフィルターが前者のフィルターに影響を与えるため、これは明らかに正しくありません。
これは正しい仮定ですか?これについて別のスレッドを開始する必要がありますか? なぜこれがこのように機能するのかを理解したいと思います。
ありがとう!
更新 3
---- 解決済み ---
このちょっとした情報はドキュメントに具体的に記載されていませんが、ルート名が異なる REST 動詞に送られる場合でも、同じルート名を持つことはできません。
//routes.php 前に
Route::get('site/login', array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/login', 'uses'=>'HomeController@postLogin',));
上記のソリューションでは、「as」が同じ名前を使用しているため、2 番目のルートが前のルートを上書きします。GET と POST ということで扱いが違うのではないかと思ったのですが、そうではありません。フィルターの割り当てはバックエンドで名前によって行われる必要があるため、同じ名前を使用すると互いにオーバーライドされます。
//routes.php AFTER
Route::get('site/login', array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/postLogin', 'uses'=>'HomeController@postLogin',));
ここでわかるように、配列の「as」部分の名前を「site/postLogin」に変更し、POST、GET、およびおそらく PUT、DELETE などごとに異なるフィルターを使用できるようになりました。