Laravel beforeFilter在POST请求的控制器上抛出非对象异常

时间:2014-07-25 14:57:29

标签: php laravel-4 laravel-routing

我尝试使用以下命令在所有控制器方法上设置一些特定的过滤器:

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;
}

如果我使用已经注册的过滤器它正在工作,那么接下来会发生什么? 在运行控制器方法之前,我几乎没有需要特定功能的控制器,所以我不能制作全局通用滤波器。还有其他好的解决方案吗?

1 个答案:

答案 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并运行过滤器。