我已经创建了一个扩展BaseController并在所有视图中共享一些数据的控制器
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function __construct()
{
$this->middleware(function ($request, $next) {
if (Auth::check()) {
$id = Auth::id();
} else {
$id = Session::getId();
}
Cart::session($id);
$cart = Cart::getContent();
$total = Cart::getTotal();
View::share('cart', $cart);
View::share('total', $total);
return $next($request);
});
}
}
问题是,它不会在404等错误页面中共享。
我使用的是Laravel 8.75
首先,您应该使用以下命令发布所有错误页面:
php artisan vendor:publish --tag=laravel-errors
那么,希望它能起作用。如果它不能工作,那么在AppServiceProvider的boot()函数中包含这个逻辑,而不是在base Controller中。
经过一些尝试和错误后,问题是web中间件没有在错误页面中执行。
添加到web.php
Route::fallback(function(){
return view('errors.404');
});
也到appServiceProvider.php boot()
(可选)
View()->composer(['layouts.main'], function($view) {
if (Auth::check()) {
$id = Auth::id();
} else {
$id = Session::getId();
}
Cart::session($id);
$cart = Cart::getContent();
$total = Cart::getTotal();
$view->with([
'cart' => $cart,
'total' => $total
]);
});
我之所以把认证检查放在视图编写器回调中,是因为中间件必须被执行才能抓住用户。