Использование Middleware для получения прав администратора - PullRequest
0 голосов
/ 23 октября 2018

Когда я пытаюсь написать правило администратора, чтобы запретить пользователям вводить определенный маршрут, я получаю эту ошибку: Свойство [имя] не существует в этом экземпляре коллекции.

Модель пользователя

<?php

public function roles()
{
    return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}

public function isAdmin()
{
    if ($this->roles->name == "Admin") {
        return true;
    }
    return false;
}

Промежуточное ПО администратора

public function handle($request, Closure $next) 
{

   if (Auth::check()) {
       if (Auth::user()->isAdmin()) {
       return $next($request);
       }
    }
    return redirect('/');
 }

Маршруты и контроллер

Route::group(['middleware' => 'admin'], function () 
{ 
    Route::get('/home', 'HomeController@index')->name('home');
});

public function __construct()
{ 
    $this->middleware('admin');  
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

$this->roles возвращает экземпляр Collection.так что вы не можете получить доступ к собственности из коллекции.Это ошибка.

В этом случае вам нужно только знать, что этот пользователь является администратором или нет.Таким образом, вам не нужно выбирать все роли, чтобы сделать это.И делать это тоже менее эффективно.

Так что лучшим решением будет использование функции exists().

public function isAdmin()
{
    // is there a role which name is admin.
    if ($this->roles()->where('name', 'Admin')->exists()) {
        return true;
    }
    return false;
}
0 голосов
/ 24 октября 2018

Отношение roles() в модели предназначено для многих ко многим, поэтому вызов $this->roles возвращает коллекцию моделей, а не один экземпляр модели.Если вы хотите проверить, является ли Admin одной из ролей текущего пользователя, попробуйте что-то вроде этого:

public function isAdmin()
{
    if ($this->roles->pluck('name')->contains('Admin')) {
        return true;
    }
    return false;
}

Метод pluck() возвращает «столбец» данных из вашей коллекции (в этом случае поле имени) как новая коллекция.Метод contains() ищет в коллекции заданное значение и возвращает значение true, если в коллекции содержится значение, или значение false, если его нет.

https://laravel.com/docs/5.7/collections#available-methods

...