首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后请求控制器中的Laravel beforeFilter抛出非对象异常

后请求控制器中的Laravel beforeFilter抛出非对象异常
EN

Stack Overflow用户
提问于 2014-07-25 14:57:29
回答 1查看 1.3K关注 0票数 0

我尝试用以下方法对所有控制器方法设置一些特定的过滤器:

代码语言:javascript
复制
public function __construct() {

   $this->beforeFilter(function(){
     //whathever
   });
}

它在正常的获取方法上运行良好,当有一些POST方法时会出现问题:

代码语言:javascript
复制
Route::post('settings/menu-order/{direction}', array(
                                            'as' => 'setting.menu-order.move',
                                            'uses' => function($direction) {
        $controller = new CMSSettingsController();
        return $controller->doMoveMenu($direction);
}));

点击一个用$direction发送帖子的按钮,我就得到了

代码语言:javascript
复制
Call to a member function filter() on a non-object 

在vendor/laravel/framework/src/Illuminate/Routing/Controller.php中

代码语言:javascript
复制
protected function registerClosureFilter(Closure $filter)
{
    $this->getFilterer()->filter($name = spl_object_hash($filter), $filter);
    return $name;
}

如果我使用已经注册的过滤器,它是工作的,那么发生了什么呢?在运行控制器方法之前,需要完成特定功能的控制器很少,因此无法进行全局通用滤波器。还有其他好的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-25 15:38:00

问题可能是,您是直接调用控制器操作,而不是让路由器为您完成它。当路由器尝试应用过滤器,而不是将它们应用到控制器上时,它最终会尝试将它们应用到doMoveMenu动作的output上--当然,它不是Controller对象,也没有方法filter

相反,您的路线应该如下所示:

代码语言:javascript
复制
Route::post('settings/menu-order/{direction}', array(
                'as' => 'setting.menu-order.move',
                'uses' => 'CMSSettingsController@doMoveMenu'));

您不需要手动执行方法调用的原因是,因为您的路由中有一个参数,并且您的方法接受一个参数,所以路由器将自动将参数传递到action方法中。此外,由于您提供的方法名为uses值,Laravel知道它必须实例化Controller并运行过滤器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24958654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档