Filter 从未调用Laravel 4路由筛选器

Filter 从未调用Laravel 4路由筛选器,filter,laravel-4,laravel-routing,Filter,Laravel 4,Laravel Routing,我确信我犯了一些非常明显的错误,但由于某些原因,我无法在测试应用程序中使用除App::before之外的任何过滤器 //routes.php Route::get('site/login', array( 'before'=>'science', 'as'=>'site/login', 'uses'=>'HomeControlle

我确信我犯了一些非常明显的错误,但由于某些原因,我无法在测试应用程序中使用除App::before之外的任何过滤器

//routes.php

Route::get('site/login',
               array(
                    'before'=>'science',
                    'as'=>'site/login',
                    'uses'=>'HomeController@getLogin',
               )
           );
Route::controller(site, 'HomeController');
Route::get('site/login', 'HomeController@getLogin')->before('science');
Route::get('site/login',
                    array(
                        'before'=>'science',
                        'as'=>'site/login',
                        'uses'=>'HomeController@getLogin'
                    )
                );
Route::post('site/login',
               array(
                    'as'=>'site/login',
                    'uses'=>'HomeController@postLogin'
               )
);
//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');
}
public function __construct(){
    $this->beforeFilter('science');
}
该对象首先是为了确保用户未登录,因此我尝试使用内置的“来宾”过滤器,但从未调用它。因此,我后来创建了“科学”过滤器来测试是否有任何路由可以工作。如果我在App::before中取消注释var_转储行,它将显示“before”并按预期退出

有人能看出我做错了什么吗?当我进入/site/login页面时,我会看到我的坏电影引用,而不是实际页面。然而,我看到我的登录表单,好像什么都没有发生

谢谢

更新: 我将路线改为现在的样子:

//routes.php

Route::get('site/login',
               array(
                    'before'=>'science',
                    'as'=>'site/login',
                    'uses'=>'HomeController@getLogin',
               )
           );
Route::controller(site, 'HomeController');
Route::get('site/login', 'HomeController@getLogin')->before('science');
Route::get('site/login',
                    array(
                        'before'=>'science',
                        'as'=>'site/login',
                        'uses'=>'HomeController@getLogin'
                    )
                );
Route::post('site/login',
               array(
                    'as'=>'site/login',
                    'uses'=>'HomeController@postLogin'
               )
);
。。。它是有效的。我在屏幕上看到调试字符串“SCIENCE…”

如果我执行以下操作,它也会起作用

//HomeController.php

public function getLogin(){
    $this->layout->body = View::make('home.login');
}
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::controller(site, 'HomeController');
Route::get('site/login', 'HomeController@getLogin')->before('science');
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请求,因此在路由中使用了不同的静态方法。然而,显然,这是不正确的,因为后者的过滤器影响前者的过滤器

这是正确的假设吗?关于这件事,我应该换个话题吗?我很想知道为什么会这样

谢谢

更新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',));
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',));
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等使用不同的筛选器。

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

----解决---

文档中没有明确说明这一小道消息,但是您不能有相同的路由名称,即使这些路由名称将用于不同的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',));
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',));
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等使用不同的过滤器。

您修改过其他文件吗?您对开始文件夹等做了哪些修改?我试过你的代码,它对我有效。我知道这很奇怪,我没有对开始文件夹或任何其他核心文件做任何更改。谢谢你的调查!我想你只是在尝试Laravel的这类项目,把它推到github回购协议上,今晚我将试用你的准确副本?我用更多信息更新了描述。只要不使用数组来指定路由参数,我就可以让它工作。我正在试用Laravel,但由于我在这个项目中签署的NDA,我不确定我能在Github上发布什么。你使用的是什么版本的Laravel,beta版?我想不是这样这很奇怪。。作为旁注,使用
returnview::make('View')而不是直接设置属性。谢谢fruityp,但我发现了问题。我在“as”数组字段中使用了相同的路由名称,这导致后者覆盖了前者。我感谢你的帮助!我只希望文档能够解释这一点!无需担心,发送拉取请求:)