Laravel 5.6 распределяет маршруты по параметрам пользователя

В маршрутах app/routes/web.php у меня есть группа с кучей маршрутов для ресурсов:

Route::group(['middleware' => 'auth'], function()
{
   Route::get('/points', 'PagesController@points');
   Route::get('/users', 'PagesController@users');
   Route::get('/users/groups', 'PagesController@user_groups');
   Route::resource('point', 'PointController');
   Route::resource('user', 'UserController');
   Route::resource('users/group', 'UserGroupController');
});

Auth::routes();

Route::get('/logout', 'Auth\LoginController@logout')->name('logout');

А теперь я хочу распределить маршруты в этой группе по пользовательскому параметру:

use App\UserGroup;

$access = UserGroup::find( auth()->user()->group_id )->access;

Route::group(['middleware' => 'auth'], function()
{
   if ($access == 1) {
      Route::get('/points', 'PagesController@points');
      Route::get('/users', 'PagesController@users');
      Route::get('/users/groups', 'PagesController@user_groups');
      Route::resource('point', 'PointController');
      Route::resource('user', 'UserController');
      Route::resource('users/group', 'UserGroupController');
   }
});

Но я не могу получить параметры пользователя прямо в Route::group, потому что возникает ошибка: Trying to get property 'group_id' of non-object

Как получить auth()->user()->group_id в app/routes/web.php до промежуточного программного обеспечения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
51
2

Ответы 2

Используйте параметр $ access в обратном вызове

$access = UserGroup::find( auth()->user()->group_id )->access

Route::group(['middleware' => 'auth'], function() use ($access)
{
   if ($access == 1) {
      Route::get('/points', 'PagesController@points');
      Route::get('/users', 'PagesController@users');
      Route::get('/users/groups', 'PagesController@user_groups');
      Route::resource('point', 'PointController');
      Route::resource('user', 'UserController');
      Route::resource('users/group', 'UserGroupController');
   }
});

Спасибо! В любом случае я могу получить доступ к auth()->user() только внутри функции Route::get, но не до Route::group или прямо внутри него.

mr.boris 01.08.2018 13:31

U может Создайте промежуточного программного обеспечения 'GroupAccess'. Тогда назначить его псевдониму, т.е.

'groupAccess' => \App\Http\Middleware\GroupAccess::class

Наконец, в этом методе обработки проверьте свое состояние

public function handle($request, Closure $next)
{
    if (UserGroup::find( auth()->user()->group_id )->access === 1)
        return $next($request);
    else
        return back();
}

Затем просто укажите это промежуточное ПО в группе маршрутов

Route::group(['middleware' => ['auth','groupAccess']], function()
{
      Route::get('/points', 'PagesController@points');
      Route::get('/users', 'PagesController@users');
      Route::get('/users/groups', 'PagesController@user_groups');
      Route::resource('point', 'PointController');
      Route::resource('user', 'UserController');
      Route::resource('users/group', 'UserGroupController');
});

Спасибо! Но теперь возникает ошибка: Class groupAccess does not exist

mr.boris 01.08.2018 19:00

Сначала вам необходимо зарегистрировать промежуточное ПО. Я обновил свой ответ, проверьте его, пожалуйста

Sergey Shuryakov 01.08.2018 19:13

попробуйте заменить return back(); на return redirect('/');

Sergey Shuryakov 01.08.2018 19:38

Большое спасибо, я добавил класс GroupAccess ко всем массивам промежуточного программного обеспечения в ядре, но теперь в недавно созданном промежуточном программном обеспечении GroupAccess.php возникла новая ошибка: Trying to get property 'group_id' of non-object

mr.boris 01.08.2018 19:38

никогда не размещайте промежуточное ПО на protected $middleware, если вам не нужно запускать его при каждом запросе к вашему приложению. Это может вызвать эту ошибку в вашем случае.

Sergey Shuryakov 01.08.2018 19:44

Я очень признателен за вашу помощь. Я удалил класс GroupAccess из protected $middleware в Kernel.php и заменил return back(); на return redirect('/'); в GroupAccess.php, но все еще имею проблему с загрузкой страницы, несмотря на тот факт, что он фактически перенаправляет на путь '/' (страница сейчас недоступна).

mr.boris 01.08.2018 20:35

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