@ChertyakaNUB

Как в middleware использовать две роли?

Всем привет!

Laravel 8.

Есть роли в проекте и у ролей есть middleware:
...
 public function handle($request, Closure $next, ... $roles)
    {
dd($roles);
...

Применяя в роуте в самом middleware разные роли:
Route::get('/page', [PageController::class, 'index'])->name('page')->middleware('role:admin,manager');

Получаю на странице перехода с помощью проверки(dd($roles);), только одну роль в массиве, последнюю: manager.
5f8c551704ea6353683051.png
Куда пропадает admin, кто может подсказать, что не так с кодом?
  • Вопрос задан
  • 542 просмотра
Решения вопроса 1
@ChertyakaNUB Автор вопроса
Понял что простых решений нет, есть одни костыли:
1 Метод, использовать несколько параметров:
в роуте:
Route::get('/page', [PageController::class, 'index'])->name('page')->middleware('role:admin,manager');

в middleware:
...
public function handle($request, Closure $next, $role1, $role2)
    {
//Используем уже здесь $role1, $role2
...

2 Метод, использовать один параметр с разделителем:
в роуте:
Route::get('/page', [PageController::class, 'index'])->name('page')->middleware('role:admin|manager');

в middleware:
...
public function handle($request, Closure $next, $role)
    {
if (!is_array($role)) {
			$roles = explode('|', $role);
		}
...

Костыли, не костыли, но решение работает.
Если вдруг вундэркинды найдут более элегантное/правильное решение, пишите!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dzmitryIhnatau
Backend php developer
RoleMiddleware
public function handle(Request $request, Closure $next, ...$role)
    {
        if(auth()->check() && auth()->user()->hasRole(...$role))
            return $next($request);
        else
            return response()->redirectToRoute('login');
    }


Модель пользователя User.php
public function hasRole(... $roles) {
        foreach ($roles as $role) {
            if ($this->roles->contains('slug', $role)) {
                return true;
            }
        }
        return false;
    }


web.php
Route::get('/certificate/{user}/{group}', [StudentsController::class, 'showDataForCertificate'])->middleware(['middleware' => 'role:super-admin,co'])->name('certificate_data');


Только вместо slug, id используй
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы