我一直在使用您的建议和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与构造函数一起使用,但这也不起作用。似乎正常工作的唯一解决方案是将代码放入每个视图的每个Controller中!确实有效,这证实了我的理论。
但是在任何地方都可以放置此代码,而不必在每个Controller中复制/粘贴它吗?预先感谢!
答案 0 :(得分:3)
Auth::user()
将为空,直到会话中间件运行为止。
在通过响应处理程序(包括中间件)发送请求之前,将调用您的服务提供商,因为服务提供商负责建立或“引导”应用程序服务,例如文件系统,缓存驱动器,等
应用程序启动后,所有服务提供商 已被注册,请求将被移交给路由器 用于调度。路由器会将请求分派到路由或 控制器,以及运行任何特定于路由的中间件。
如果您不想在各处复制/粘贴该代码,则将其放在自定义路由中间件中是一个地方。确保它在auth
中间件之后运行,以确保有登录用户。
编辑:如@surgiie所述,视图作曲家是另一个非常好的选择
答案 1 :(得分:3)
您可能希望将此代码放在请求生命周期的后面,以保证有auth用户,因为正如其他人提到的那样,在框架的这一部分启动期间未发生中间件/会话代码。您可以使用服务类来调用所有控制器,以避免复制粘贴。或者,如果您想在服务提供商中使用代码来实现此目的,则可以使用View Composer而不是共享,这可以让您定义将在返回视图之前立即调用的回调/或类
view()->composer(['/uri-that-needs-data'], function ($view) {
if (Auth::check()) {
$cart = DB::query(...)->get();
$view->with('cartitems', $cart);
}
});
查看https://laravel.com/docs/5.7/views#view-composers了解更多详细信息。