在哪里可以检查用户是否已在Laravel应用程序中登录?

时间:2019-02-10 16:30:29

标签: laravel authentication laravel-5 login laravel-5.7

我一直在使用您的建议和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中复制/粘贴它吗?预先感谢!

2 个答案:

答案 0 :(得分:3)

Auth::user()将为空,直到会话中间件运行为止。

在通过响应处理程序(包括中间件)发送请求之前,将调用您的服务提供商,因为服务提供商负责建立或“引导”应用程序服务,例如文件系统,缓存驱动器,等

  

应用程序启动后,所有服务提供商   已被注册,请求将被移交给路由器   用于调度。路由器会将请求分派到路由或   控制器,以及运行任何特定于路由的中间件。

     

来源:https://laravel.com/docs/5.7/lifecycle

如果您不想在各处复制/粘贴该代码,则将其放在自定义路由中间件中是一个地方。确保它在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了解更多详细信息。

相关问题