我一直在使用您的建议和View ::将所有重要数据共享给所有视图。但是,我遇到过一个问题。
这段代码:
if(!Auth::guest()){
$user=Auth::user()->id;
}
else $user=0;
$temp=DB::select('query');
View::share('cartnumber', count($temp));
View::share('cartitems', $temp);
放入AppServiceProvider时不起作用。或者更好的是,它总是设置$ user = 0,即使我已登录。我认为这是因为AppServiceProvider的启动功能在站点检查是否有人登录之前执行。
然后我尝试使用带有构造函数的BaseController,但这也不起作用。似乎正常工作的唯一解决方案是将代码放在每个视图的每个控制器中!这确实有效,这证实了我的理论。
但是,我可以在任何地方放置此代码而无需在每个控制器中复制/粘贴它吗?提前致谢!
您可能希望稍后在请求生命周期中放置此代码以保证auth用户,因为正如其他人所提到的那样,在框架启动的这一部分期间没有发生中间件/会话代码。您可以使用服务类调用所有控制器以避免复制粘贴。或者如果您想使用服务提供程序中的代码实现此目的,您可以使用View Composer而不是共享,这允许您定义将在返回视图之前调用的回调/或类
view()->composer(['/uri-that-needs-data'], function ($view) {
if (Auth::check()) {
$cart = DB::query(...)->get();
$view->with('cartitems', $cart);
}
});
在会话中间件运行之前,Auth::user()
将为空。
在通过响应处理程序(包括中间件)发送请求之前调用服务提供程序,因为服务提供程序负责设置或“引导”应用程序服务,如文件系统,缓存驱动程序等。
一旦应用程序被引导并且所有服务提供商都已注册,请求将被切换到路由器以进行分派。路由器会将请求分派给路由或控制器,以及运行任何路由特定的中间件。
如果您不想在任何地方复制/粘贴该代码,那么将其置于自定义路由中间件中的一个位置。确保它在auth
中间件之后运行,以保证有登录用户。
编辑:根据@surgiie的建议,查看作曲家是另一个非常好的选择