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
中加载它
所以我的一些路由使用了 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
中加载它