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 行,它会显示“之前”并按预期退出。

谁能看到我在这里做错了什么?当我转到 /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”使用了相同的名称。我认为这些会被区别对待,因为一个是 GET,另一个是 POST,但事实并非如此。过滤器分配必须在后端按名称发生,因此,使用相同的名称将相互覆盖。

//routes.php 之后

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

如果两个或多个路由使用相同的过滤器,为了更好的实践,这些路由应该属于一个组。我有一种感觉,可以纠正这个问题。

来自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 回答
1

- - 解决了 - -

文档中没有具体说明这些信息,但是即使这些路由名称将用于不同的 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”使用了相同的名称。我认为这些会被区别对待,因为一个是 GET,另一个是 POST,但事实并非如此。过滤器分配必须在后端按名称发生,因此,使用相同的名称将相互覆盖。

//routes.php 之后

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 等使用不同的过滤器。

于 2013-11-04T20:43:05.327 回答