Концепция метода laravel first()

Метод laravel first() довольно прост, поэтому этот вопрос может быть глупым, но я не понимаю, как использовать метод first().

На самом деле, я следую учебному пособию на YouTube, где я аутентифицирую пользователя, если у него есть роль admin, тогда только он получит доступ route, в противном случае он будет перенаправлен на 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(), то все пользователи получат доступ к route, чего я не понимаю?

Вы должны отправить этот SQL. Используя get() или first(). Если вы не используете эти методы, то ваш красноречивый объект никогда не будет null. Это означает, что вы никогда не получите результатов.

m1k1o 09.06.2019 18:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
5
1
11 068
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документам:

The first method returns the first element in the collection that passes a given truth test:

collect([1, 2, 3, 4])->first(function ($value, $key) {
    return $value > 2;
});
// 3

You may also call the first method with no arguments to get the first element in the collection. If the collection is empty, null is returned:

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.

Другие вопросы по теме