Как я могу создавать динамические маршруты?

#php #laravel #routing #acl

#php #laravel #маршруты #acl

Вопрос:

У меня есть этот путь:

 http://localhost:8000/home
  

Я хочу, когда обычный пользователь открывает path выше, тогда я вызываю этот контроллер:

 mainPage@index
  

Но когда администратор открывает этот путь, тогда я вызываю этот контроллер:

 panelPage@index
  

Итак, как вы видите, я ищу что-то вроде «динамических маршрутов» .. Возможна ли такая реализация? Другими словами, могу ли я вызвать два разных контроллера для администратора и обычного участника?

Комментарии:

1. Да, это возможно. Вы можете создавать группы промежуточного программного обеспечения. Используете ли вы аутентификацию Laravel? Вы уже создали что-то вроде AdminMiddleware?

2. @JanWillem Я так понимаю, текущий пользователь — либо администратор, либо обычный участник, подобный этому: @if( Auth::user()->admin ) { // admin } else { // regular member }

Ответ №1:

Это хороший пример использования промежуточных программ для фильтрации HTTP-запросов.

Вы также могли бы сделать что-то условное в вашем файле маршрутов, например:

 if (Auth::user()->isAdmin()){
    Route::get('/', 'panelPage@index');
} 
else {
    Route::get('/', 'mainPage@index');
}
  

В зависимости от того, как выглядит ваше приложение, вы можете определить isAdmin() в вашей пользовательской модели. Это очень простой пример, где у вас есть столбец с именем role_id, а идентификатор nr 1 равен admin. Если аутентифицированный пользователь является администратором, отображается значение true, в противном случае false:

 public function isAdmin()
    {
       return Auth::user()->role_id == 1;
    }
  

Более динамичным и продвинутым подходом было бы создать таблицу ролей и связать роль с пользователем с помощью сводной таблицы role_user.

Если вы хотите сделать еще один шаг вперед, вы можете создать таблицу разрешений и связать роль с разрешениями с помощью сводной таблицы permission_role. Затем вы можете в своем приложении определить, что для выполнения действия требуется разрешение, и добавить все разрешения, которые имеет данная роль пользователя, в эту сводную таблицу. Затем вы просто проверяете, имеет ли пользователь (с определенной ролью) указанные разрешения.

Комментарии:

1. Выдает эту ошибку: Call to a member function isAdmin() on null

2. isAdmin — это всего лишь образец, в данном случае вам нужно определить, что такое «isAdmin()». То, как вы это определяете, зависит от того, как вы разработали свое приложение. Если у вас есть «role_id» в таблице users, то вы можете создать метод с именем isAdmin(), который проверяет, является ли соответствующий role_id идентификатором администратора. Итак, когда вы вызываете isAdmin(), вы проверяете, имеет ли пользователь правильный role_id. Я обновлю ответ примером.

Ответ №2:

Для лучшей практики вы могли бы использовать промежуточное программное обеспечение для сортировки и категоризации ваших маршрутов и контроллеров.

В этом — относительно простом — случае вы также могли бы использовать что-то вроде этого (в вашем файле routes).:

 if(!is_null(Auth::user()))  {
  // first check if user is logged in, else Auth::user() will return null
  $uses = 'mainPage@index';
  if(Auth::user()->admin) {
    $uses = 'panelPage@index';
  }
  Route::get('/', $uses);
}
  

Обновить

Или вы могли бы обернуть все внутри этого оператора if в группу промежуточного программного обеспечения auth, вот так:

 Route::group(['middleware' => ['auth']], function(){
   $uses = 'mainPage@index';
    if(Auth::user()->admin) {
     $uses = 'panelPage@index';
    }
    Route::get('/', $uses);
});
  

Также убедитесь, что в вашей таблице users есть столбец с именем ‘admin’.

Комментарии:

1. ваш код выдает эту ошибку: ErrorException in routes.php line 18: Trying to get property of non-object