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

Laravel csrf filter throwing exception before Controller constructor

所以我的一些路由使用了 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() 中我做了一些基本的初始化,这包括为视图设置一些变量

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() 事件中,但我宁愿避免这样做,因为该方法可能会变得非常大。

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

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

例如,您可以在新文件 app/composers.php 中注册您的视图编辑器,然后使用 require app_path().'/composers.php';

app/start/global.php 中加载它