Концепция метода laravel first () - PullRequest
0 голосов
/ 09 июня 2019

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

На самом деле, я следую учебному пособию по YouTube, где я аутентифицирую пользователя, если он имеет роль admin, тогда только он получит доступ к route, в противном случае будет перенаправлен на home.

Нет ошибок или проблем с кодом, но я понимаю.

Я возвращаю пользователя в функции класса модели User, если роль пользователя передана промежуточным программным обеспечением

Маршрут

Route::get('admin', function (){
     return 'This is Admin page';
})->middleware(['auth', 'auth.admin']);

Middleware

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, чего я не понимаю, почему?

1 Ответ

3 голосов
/ 09 июня 2019

По документам:

Первый метод возвращает первый элемент в коллекции, который проходит данный тест на истинность:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...