Laravel csrf过滤器在Controller构造函数之前抛出异常

时间:2015-01-08 21:43:03

标签: php laravel

所以我的一些路由使用csrf过滤器,我已添加如下:

Route::post('/user/notifications/dismiss', array('before' => 'csrf', 'uses' => 'UsersController@dismiss'));

在我的start / global.php中,我设置了错误处理程序以在生产环境中生成视图(此示例简化了代码)

App::error(function(Exception $exception, $code)
{
    Log::error($exception);

    if(Config::get('app.debug') === false) {
        return Response::view('message', array('title' => $code, 'message' => 'Server error'));
    }
});

在我的BaseController __construct()中我做了一些基本的init,这包括在视图中设置一些变量

class BaseController extends Controller {

    public function __construct() {
        $user = Auth::user();
        View::share('user', $user);

        $this->setupAssets();
        $this->setupOtherStuff();
        ...
    }

    // css and js files to include
    protected function setupAssets() {
        $stylesheets = array(
            '/css/styles.css',
        );

        View::share('stylesheets', $stylesheets);

        $javascripts = array(
            '/js/script.js',
        );

        View::share('javascripts', $javascripts);
    }

    ...

问题是,当应用程序未通过csrf检查时,它会在过滤器中引发异常。此时BaseController __construct()尚未运行,因此我得到一堆错误,视图中使用的变量未分配。

我的问题是,解决这个问题的最佳方法是什么?我可以将所有视图分配放在App :: before()事件中,但我宁愿避免这样做,因为方法会变得非常大。

1 个答案:

答案 0 :(得分:1)

当然,您的控制器不会被调用,也不应该被调用。不要改变它,而是使用view composers来制作" global"您视图中可用的变量:

View::composer('layout', function($view){
    $view->with('user', Auth::user());
    // and so on...
});

您可以在新文件app/composers.php中注册视图编辑器,并将其加载到app/start/global.php require app_path().'/composers.php';