В маршрутах 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 до промежуточного программного обеспечения?






Используйте параметр $ 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');
}
});
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
Сначала вам необходимо зарегистрировать промежуточное ПО. Я обновил свой ответ, проверьте его, пожалуйста
попробуйте заменить return back(); на return redirect('/');
Большое спасибо, я добавил класс GroupAccess ко всем массивам промежуточного программного обеспечения в ядре, но теперь в недавно созданном промежуточном программном обеспечении GroupAccess.php возникла новая ошибка: Trying to get property 'group_id' of non-object
никогда не размещайте промежуточное ПО на protected $middleware, если вам не нужно запускать его при каждом запросе к вашему приложению. Это может вызвать эту ошибку в вашем случае.
Я очень признателен за вашу помощь. Я удалил класс GroupAccess из protected $middleware в Kernel.php и заменил return back(); на return redirect('/'); в GroupAccess.php, но все еще имею проблему с загрузкой страницы, несмотря на тот факт, что он фактически перенаправляет на путь '/' (страница сейчас недоступна).
Спасибо! В любом случае я могу получить доступ к
auth()->user()только внутри функцииRoute::get, но не доRoute::groupили прямо внутри него.