我尝试使用以下命令在所有控制器方法上设置一些特定的过滤器:
public function __construct() {
$this->beforeFilter(function(){
//whathever
});
}
并且它在正常的GET方法上运行良好,遇到POST方法时会出现问题:
Route::post('settings/menu-order/{direction}', array(
'as' => 'setting.menu-order.move',
'uses' => function($direction) {
$controller = new CMSSettingsController();
return $controller->doMoveMenu($direction);
}));
点击一个按$发送POST的按钮,我得到了
Call to a member function filter() on a non-object
在vendor / laravel / framework / src / Illuminate / Routing / Controller.php
中protected function registerClosureFilter(Closure $filter)
{
$this->getFilterer()->filter($name = spl_object_hash($filter), $filter);
return $name;
}
如果我使用已经注册的过滤器它正在工作,那么接下来会发生什么? 在运行控制器方法之前,我几乎没有需要特定功能的控制器,所以我不能制作全局通用滤波器。还有其他好的解决方案吗?
答案 0 :(得分:0)
问题可能是您直接调用控制器操作而不是让路由器为您执行操作。当路由器尝试应用过滤器而不是在控制器上应用过滤器时,它最终会尝试将它们应用于doMoveMenu
动作的输出 - 当然,这不是一个Controller
对象,没有方法filter
。
相反,您的路线应如下所示:
Route::post('settings/menu-order/{direction}', array(
'as' => 'setting.menu-order.move',
'uses' => 'CMSSettingsController@doMoveMenu'));
您不需要手动执行方法调用的原因是,由于您的Route中有一个参数,并且您的方法接受参数,因此路由器会自动将参数传递给action方法。此外,由于您提供的方法名称为uses
值,因此Laravel知道必须实例化Controller并运行过滤器。