请问怎么在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属性中??

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

class HomeController extends Controller
{
    public $user;

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

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

4年前 评论

楼上说的对,定义个辅助函数比较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();
    }
}
4年前 评论
$this->user = auth()->user();

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

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

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

file @小李世界 @muyunde

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

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

4年前 评论

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

4年前 评论

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

file

4年前 评论

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

file

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

这是我的路由文件

file

这是我改的控制器

file

这是我的测试代码

file

然后,结果还是一样,null

file

非常谢谢你

4年前 评论

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

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

class HomeController extends Controller
{
    public $user;

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

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

4年前 评论
zpers 4年前
Complicated

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

4年前 评论
Complicated

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

4年前 评论

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

4年前 评论

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