laravel first()
方法非常简单,这就是为什么这个问题可能很愚蠢的原因,但是我不理解first()
方法的使用。
实际上,我正在关注一个youtube教程,其中我在对用户进行身份验证,如果该用户具有admin
的角色,则只有他才能获得route
的访问权限,否则将被重定向到{{1 }}。
除了我的理解之外,代码没有任何错误或问题。
如果用户具有中间件传递的角色,我将在home
模型类函数中返回用户
路线
User
中间件
Route::get('admin', function (){
return 'This is Admin page';
})->middleware(['auth', 'auth.admin']);
用户模式
public function handle($request, Closure $next)
{
if (Auth::user()->hasAnyRole('admin'))
{
return $next($request);
}
return redirect('home');
}
如果我在public function hasAnyRole($role)
{
return null !== $this->roles()->where('name', $role)->first();
}
函数中使用first()
方法,那么只有hasAnyRole
受其他用户的保护,只有route
可以访问该路由,
如果我删除了admin
方法,那么所有用户都可以访问first()
,但我不知道为什么?
答案 0 :(得分:3)
根据文档:
第一个方法返回通过给定的真实性测试的集合中的第一个元素:
collect([1, 2, 3, 4])->first(function ($value, $key) {
return $value > 2;
});
// 3
您也可以调用不带参数的第一个方法来获取集合中的第一个元素。如果集合为空,则返回null:
collect([1, 2, 3, 4])->first();
// 1
在您的问题中,如果您不使用first()
方法,它将返回一个没有数据的集合,例如:
Roles {#1
[]
}
此空集合不等于null
。
关于!==
运算符
$x !== $y
前一个代码段,如果$ x不等于$ y或它们不是同一类型,则返回true。
因此,在您的代码中:
return null !== $this->roles()->where('name', $role)->first();
当(且仅当)用户不具有必需的角色(通过true
方法完成的操作)时,它将返回first()
:
$this->roles()->where('name', 'admin')->first();
如果用户没有admin
角色,则返回null
,null
是相同类型的(在您的比较中)。因此它返回false
,导致null !== null
返回false,并且不授予访问权限。
如果您使用类似
$this->roles()->where('name', 'admin');
并且用户没有admin
角色,它将返回类似以下内容的内容:
Roles {#1
[]
}
现在,您的hasAnyRole
函数将返回true
,并且将访问权授予用户,因为空集合不是同一类型,并且也不等于null
;
有关first
方法的文档。