Laravel:模型(GlobalScope)的boot()方法中的request-> user()

时间:2019-01-02 10:05:57

标签: php laravel eloquent

我有一些无法解释的行为。我正处于一个相当大的重构过程中,遇到了一个在代码中已经存在很长时间的问题,但是它似乎在重构之前就可以解决。

在某些型号上,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);
                    });
                });
            }
        }
    });
}

第二个例子来自重构之前的模型。 此方法已在多个模型上使用,但从未出现任何问题。有谁知道为什么在$user方法的回调之外调用request()->user()boot为空?最重要的是,为什么以前从未出现过问题?

1 个答案:

答案 0 :(得分:0)

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