【问题标题】:Laravel 5.4 Sessions and Auth::user() not available in controller's constructorLaravel 5.4 Sessions 和 Auth::user() 在控制器的构造函数中不可用
【发布时间】:2017-11-10 17:16:49
【问题描述】:

我想通过应用程序使用用户类。所以,我想创建 CustomUser,然后将它注入到需要它的控制器中(大部分都是)。

现在,我在 serviceprovider 中创建一个空实例。接下来,我想用已经保存在 Auth::user() 中的数据填充它。找了好久也没找到在哪里做。

Auth::user() 在中间件中为空,但在控制器中填充了用户数据。我错过了 Laravel 查询数据库并用数据填充 Auth:user() 的步骤。我想避免再次进行相同的查询。

感谢您的帮助!

【问题讨论】:

  • 您可以尝试使用属性$user 创建基本控制器并将其设置在__constructor() 中。例如:public function __constructor{ $this->user = Auth::user(); }
  • 安德烈,我试过了。 Auth::user() 在“类 Controller 扩展 BaseController”中为空。然后每个控制器扩展 Controller 类,并且它已经包含数据。 Auth::user 介于两者之间。
  • 不,不... Auth::user() 在任何地方都可以正常工作。如果它是空的,可能是授权系统有问题。
  • 在Controller构造函数中好像是空的。从路由器调用的方法运行良好。

标签: laravel authentication


【解决方案1】:

从 Laravel 5.3 开始,您无法在控制器构造函数中访问 sessions。这是因为中间件还没有运行。我知道很难找到,但是在 5.2 > 5.3 的迁移文档中(您可能在 5.4 上),它表明从会话中解析数据的正确方法(其中 auth() 只是一个包装器 session()调用获取用户),就是使用如下方法:

class MyController extends Controller {
    protected $user;

    public function __construct() {
        $this->middleware(function ($request, $next) {
           $this->user= auth()->user();

           return $next($request);
        });
    }
}

然后$this->user 会将auth 用户引用到此控制器内部的任何方法。

希望他能有所帮助。

【讨论】:

  • 谢谢!请问,我把代码放在哪里?它可以像在类定义中那样放置吗?进入构造函数?
  • @PeterMatisko 抱歉,我的动作太快了。已更新。
  • 非常感谢!问题/标题是否清楚?或许其他人也用类似的东西打架。
  • @PeterMatisko 我认为这与其说是依赖注入,不如说是为什么会话在类构造函数中不可用。
【解决方案2】:

您可以将基本控制器与__get() method 一起使用。例如:

class Controller
{
    public function __get(string $name)
    {
        if($name === 'user'){
            return Auth::user();
        }

        return null;
    }
}

并且在子控制器中可以调用$this->user

【讨论】:

    【解决方案3】:

    在 Laravel 5.6 中我使用了这个

    $this->middleware(function ($request, $next) {
            $id = Auth::user()->id;
            $res = $this->validateAnyFunction($id);
            if(!$res){
            //to redirect to any other route
                return $next(redirect()->route("any")->with("failed","Invalid")->send());
            }
            //this is used to proccess futher funcitons of controller
            return $next($request);
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-03
      • 2014-09-21
      • 2018-03-09
      • 2017-06-29
      • 2016-10-01
      • 2016-11-20
      • 1970-01-01
      • 2018-12-17
      相关资源
      最近更新 更多