请问怎么在Laravel 6.0中的每个控制器将当前用户绑定到$this->user属性中??

已经知道在每个控制器中可以使用request()->user()和auth()->user()获取当前用户,但每次都要这样获取一下,总觉得很烦,于是,想通过在父级Controller的构造方法中注入一个UserModel类,如下:

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests, MyResponse;

    protected $user;

    public function __construct(UserModel $user)
    {
        $this->user = $user;
    }
}

请问怎么在Laravel 6.0中的每个控制器将当前用户绑定到$this->user属性中??
然后,在每个控制器中访问,像这样:

namespace App\Http\Controllers;

class Test extends Controller
{
    public function test()
    {
        dd($this->user);
    }
}

但,我得到的却只是UserModel模型,而不是当前用户的实例,结果如下:

请问怎么在Laravel 6.0中的每个控制器将当前用户绑定到$this->user属性中??

请问,我要如何才能实现呢??

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

class HomeController extends Controller
{
    public $user;

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->user = auth()->user();
            return $next($request);
        });
    }
}
3年前 评论
largezhou 3年前
23tl (作者) 3年前
largezhou 3年前
讨论数量: 14
巴啦啦

没必要注入。 $this->user = auth()->user(); 推荐 getUser(){return auth()->user();}

3年前 评论

楼上说的对,定义个辅助函数比较OK。 如果真的想用$this,你可以直接在父类用$this->user = auth()->user()。


namespace App\Http\Controllers;

use App\Models\User;

class BaseController extends Controller
{
    public function __construct(protected User $user)
    {
        $this->user = auth()->user();
    }
}
3年前 评论
$this->user = auth()->user();

可以吗?不过感觉差不了多少

  • auth()->user()
  • $this->user
3年前 评论

@巴啦啦 可是,我试过了,这个方法并不行,返回的$this->user竟然是null

file @小李世界 @muyunde

3年前 评论
小李世界 3年前
muyunde 3年前
acehua (作者) (楼主) 3年前
Complicated

让你的controller继承一个公共的controller,在公共的controller 定义$user属性,然后在公共的controller的__construct()用 auth()->user()赋值给$user,,在你的controller直接用user不就ok了?

3年前 评论

@Complicated 请问你看了我下面贴的代码了吗?我就是这样写的啊,然而不行 @Complicated 不过,我的唯一区别就是,我没有单独再新建一个controller,而是,直接在laravel初始的那个控制器中新建构造方法,一会儿我试试,不知道是不是这个问题

3年前 评论

新建了6.20.15版本,代码照着你的写得,没问题。看不出来你问题在哪了。

file

3年前 评论

@muyunde 谢谢你,但我尝试了一下,还是不可以。 我重新用composer下了一样的laravel版本 6.20.15

file

在User模型中只改了个表名 file

这是我的路由文件

file

这是我改的控制器

file

这是我的测试代码

file

然后,结果还是一样,null

file

非常谢谢你

3年前 评论

@muyunde 如果可以的话,能不能把你的整个代码打包发给我,我测试一下。谢谢

3年前 评论
muyunde 3年前
acehua (作者) (楼主) 3年前
muyunde 3年前
acehua (作者) (楼主) 3年前

class HomeController extends Controller
{
    public $user;

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->user = auth()->user();
            return $next($request);
        });
    }
}
3年前 评论
largezhou 3年前
23tl (作者) 3年前
largezhou 3年前

@23tl 大佬啊,成功了,成分感谢 :+1: :+1: :+1: 请问,我想深入的学习一下laravel,比如,生命周期,容器,注入,门面,相关知识,有哪些渠道可以学习的吗?

3年前 评论
zpers 3年前
Complicated

@acehua 不好意思没认真看你的帖子,刚才把帖子又看了一遍,感觉是这样的:auth()->user()其实是基于laravel 的session机制的,然后laravel 从5.3以后是不允许在construct()使用session相关的操作的(因为中间件的启动顺序不一样),所以你之前一开始在construct()始终获取的是null

3年前 评论
Complicated

@acehua 23tl兄弟的写法是可以的,因为是的 middleware 的回调中,实际上还是在中间件中操作的session

3年前 评论

@Complicated 谢谢,后来调试了一下,一开始构造函数里面的auth()_>user()是null,导致后面是null。谢谢

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!