Laravel共享数据到404页面查看



我已经创建了一个扩展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
]);
});

我之所以把认证检查放在视图编写器回调中,是因为中间件必须被执行才能抓住用户。

最新更新