Laravel добавляет настраиваемое промежуточное ПО в группу маршрутов

В моем веб-приложении у меня есть панель администратора, и я пытаюсь получить доступ к пользователям, у которых есть роль администратора, с помощью этого кода:

namespace App\Http\Middleware;
use Closure;
class CheckUserAdminRole
{
    public function handle($request, Closure $next)
    {
        if (auth()->check()) {
            if (auth()->check() && !auth()->user()->hasRole('admin')) {
                auth()->logout();
                return redirect(route('system.messages','userIsNotAdmin'));
            }
        }
        return $next($request);
    }
}

и в моих маршрутах у меня есть эта группа маршрутов:

Route::group(['namespace' => 'Dashboard', 'middleware' => ['auth:web'], 'prefix' => 'dashboard'], function () {
    $this->group(['prefix' => 'administrator'], function () {
        $this->get('panel', 'AdminController@index');
});

мое ядро:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    ...
    \App\Http\Middleware\CheckUserAdminRole::class,
];

теперь, когда я добавляю свое промежуточное ПО как CheckUserAdminRole в группу маршрутизации, как с этим кодом:

Route::group(['namespace' => 'Dashboard', 'middleware' => ['auth:web','CheckUserAdminRole'], 'prefix' => 'dashboard'], function () {

я получаю эту ошибку:

Class CheckUserAdminRole does not exist

эти коды не смогли решить мою проблему:

php artisan route:clear
php artisan cache:clear
php artisan config:clear
composer dump-autoload
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
6
0
27 119
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вместо того, чтобы регистрировать промежуточное ПО в массиве $middleware, вы должны зарегистрировать его в $routeMiddleware следующим образом:

protected $routeMiddleware = [
    ...
    'checkAdmin' => \App\Http\Middleware\CheckUserAdminRole::class,
];

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

Затем вы можете использовать его в своих маршрутах с именем checkAdmin:

Route::group(['namespace' => 'Dashboard', 'middleware' => ['auth:web','checkAdmin'], 'prefix' => 'dashboard'], function () {

Источник

Вы также можете легко использовать промежуточное ПО и группу маршрутов, например:

Route::group(['prefix' => 'admin',  'middleware' => 'auth'], function()
{
    //All the routes that belongs to the group goes here
    Route::get('dashboard', function() {} );
});

You can try middleware with prefix and groups.

Route::middleware(['Auth'])->prefix('api/')->group(function() {
    Route::group(['prefix' => 'review/'], function () {
       Route::get('/', 'User\Controllers\Api\UserController@getUserReviews');
    });
});

Надеюсь, это поможет

Вот простое исправление, не касаясь файла Kernel и не используя преимущества Policy. accessAdmin - это функция, созданная внутри файла Policy.

Route::group(['namespace' => 'Dashboard', 'middleware' => 'can:accessAdmin, App\User', 'prefix' => 'dashboard'], function () {
$this->group(['prefix' => 'administrator'], function () {
    $this->get('panel', 'AdminController@index');
});

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