我确信我做错了很明显,但出于某种原因,除了App ::之前我无法获得任何过滤器才能在我的测试应用程序中工作。
// 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');
}
该对象首先确保用户未登录,因此我尝试使用内置的“guest”过滤器,但它从未被调用过。所以我后来创建了“科学”过滤器来测试任何路线是否有效。如果我取消注释App ::之前的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路由是导致问题的原因。当我在GET路由之前放置POST路由时,GET路由按预期使用过滤器。
现在,我的印象是Laravel对GET和POST请求的处理方式不同,因此在Route中使用了不同的静态方法。然而,显然,这不是真的,因为后者的滤波器会影响前者的滤波器。
这是正确的假设吗?我应该开始一个不同的线程吗?我很想知道为什么这样做。
谢谢!
更新3
----已解决---
这些信息没有在文档中明确说明,但是不能具有相同的路由名称,即使这些路由名称将使用不同的REST动词。
// routes.php BEFORE
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 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等使用不同的过滤器。
答案 0 :(得分: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
});
});
答案 1 :(得分:1)
----已解决---
这些信息没有在文档中明确说明,但是不能具有相同的路由名称,即使这些路由名称将使用不同的REST动词。
// routes.php BEFORE
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 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等使用不同的过滤器。