0

非常に明白な何か間違ったことをしていると確信していますが、何らかの理由で、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 などごとに異なるフィルターを使用できるようになりました。

4

2 に答える 2

1

2 つ以上のルートが同じフィルターを使用する場合のより良い実践のために、それらのルートはグループに属している必要があります。問題を修正する気がします。

http://laravel.com/docs/routing#route-groupsから

Route::group(array('before' => 'auth'), function()
{
    Route::get('/', function()
    {
        // Has Auth Filter
    });

    Route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});
于 2013-11-01T16:53:55.503 に答える