我尝试用以下方法对所有控制器方法设置一些特定的过滤器:
public function __construct() {
$this->beforeFilter(function(){
//whathever
});
}它在正常的获取方法上运行良好,当有一些POST方法时会出现问题:
Route::post('settings/menu-order/{direction}', array(
'as' => 'setting.menu-order.move',
'uses' => function($direction) {
$controller = new CMSSettingsController();
return $controller->doMoveMenu($direction);
}));点击一个用$direction发送帖子的按钮,我就得到了
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;
}如果我使用已经注册的过滤器,它是工作的,那么发生了什么呢?在运行控制器方法之前,需要完成特定功能的控制器很少,因此无法进行全局通用滤波器。还有其他好的解决办法吗?
发布于 2014-07-25 15:38:00
问题可能是,您是直接调用控制器操作,而不是让路由器为您完成它。当路由器尝试应用过滤器,而不是将它们应用到控制器上时,它最终会尝试将它们应用到doMoveMenu动作的output上--当然,它不是Controller对象,也没有方法filter。
相反,您的路线应该如下所示:
Route::post('settings/menu-order/{direction}', array(
'as' => 'setting.menu-order.move',
'uses' => 'CMSSettingsController@doMoveMenu'));您不需要手动执行方法调用的原因是,因为您的路由中有一个参数,并且您的方法接受一个参数,所以路由器将自动将参数传递到action方法中。此外,由于您提供的方法名为uses值,Laravel知道它必须实例化Controller并运行过滤器。
https://stackoverflow.com/questions/24958654
复制相似问题