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


Laravel csrf filter throwing exception before Controller constructor

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

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

在我的开始/全局中.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::composer('layout', function($view){
    $view->with('user', Auth::user());
    // and so on...
});

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