我有一些无法解释的行为。我正处于一个相当大的重构过程中,遇到了一个在代码中已经存在很长时间的问题,但是它似乎在重构之前就可以解决。
在某些型号上,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
为空?最重要的是,为什么以前从未出现过问题?
答案 0 :(得分:0)
这可能与以下事实有关:为了在使用request()-> user()时获取用户,它必须注册所有全局范围,然后执行查询。它实际上检查会话是否存在,然后查询以使该用户返回用户对象。也许您需要使用本地范围,或者Auth :: check()将完成此工作。