所以我的一些路由使用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()事件中,但我宁愿避免这样做,因为方法会变得非常大。
答案 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';