По документам:
Первый метод возвращает первый элемент в коллекции, который проходит данный тест на истинность:
collect([1, 2, 3, 4])->first(function ($value, $key) {
return $value > 2;
});
// 3
Вы также можете вызвать первый метод без аргументов, чтобы получить первый элемент в коллекции. Если коллекция пуста, возвращается ноль:
collect([1, 2, 3, 4])->first();
// 1
В вашем вопросе, если вы не используете метод first()
, он вернет коллекцию без данных, например:
Roles {#1
[]
}
Эта пустая коллекция не равна null
.
Об операторе !==
$x !== $y
В предыдущем фрагменте возвращается значение true, если $ x не равно $ y или они не одного типа.
Итак, в вашем коде:
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
.