代码之家  ›  专栏  ›  技术社区  ›  Odyssee

Laravel:request->user()在model的boot()方法中(GlobalScope)

  •  1
  • Odyssee  · 技术社区  · 5 年前

    我有些行为我无法解释。我正在进行一个相当大的重构,我遇到了一个在代码中存在了很长时间的问题,但它似乎在重构之前就可以工作了。

    关于某些模型 static::addGlobalScope request()->user() . 它在回调中工作,没有问题,但是当移到回调之外时,它返回 null .

    工作示例:

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('auth', function (Builder $builder) {
            $user = request()->user();
    
            if ($user) {
                if ($user->role == 'consultant') {
                    $builder->where('user_id', $user->id);
                } elseif ($user->role == 'approver') {
                    $builder->whereHas('contract', function ($query) use ($user) {
                        return $query->whereHas('approvers', function ($query) use ($user) {
                            return $query->where('user_id', $user->id);
                        });
                    });
                }
            }
        });
    }
    

    $user 为空。

    protected static function boot()
    {
        parent::boot();
        $user = request()->user(); // Moved $user outside of the callback
    
        static::addGlobalScope('auth', function (Builder $builder) use ($user) {
            if ($user) {
                if ($user->role == 'consultant') {
                    $builder->where('user_id', $user->id);
                } elseif ($user->role == 'approver') {
                    $builder->whereHas('contract', function ($query) use ($user) {
                        return $query->whereHas('approvers', function ($query) use ($user) {
                            return $query->where('user_id', $user->id);
                        });
                    });
                }
            }
        });
    }
    

    第二个例子取自重构之前的模型。 此方法用于多个模型,但从未出现任何问题。有人知道为什么吗 $用户 请求()->用户() boot 方法?最重要的是,为什么它从来没有提出过问题?

    1 回复  |  直到 5 年前
        1
  •  0
  •   Vaggelis Ksps    5 年前

    这可能与以下事实有关:为了在使用request()->user()时获取用户,必须注册所有全局作用域,然后执行查询。它实际上检查会话是否存在,然后查询以获得该用户返回用户对象。可能需要使用本地作用域,或者Auth::check()将完成此工作。