Промежуточное ПО Laravel

Я создал промежуточное программное обеспечение Laravel с помощью этого кода:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Containers\Modals\Models\Modal;

class ModalsMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next, string $modalNames): Response
    {
        $modals = explode(',', $modalNames);
        foreach ($modals as $modalName) {
            $modal = Modal::where('slug', $modalName)->first();
            if (!$modal->enabled) {
                abort(404);
            }
        }
        return $next($request);
    }
}

Затем я обновил Kernel.php:

**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array<string, class-string|string>
     */
    protected $routeMiddleware = [
       ...,
       'modals' => \App\Http\Middleware\ModalsMiddleware::class,
    ];

И для моей группы маршрутов я добавил следующее:

Route::group([
    'prefix' => 'api/v1/routeName',
    'middleware' => ['auth:api', 'modals:AModalName']
], function() {...});

Тогда я побежал: php artisan optimize && php artisan config:cache && php artisan cache:clear && php artisan config:clear && composer dump-autoload И остановил обслуживание, а затем перезапустил приложение.

Однако у меня была эта ошибка:

"message": "Target class [modals] does not exist.",
    "exception": "Illuminate\\Contracts\\Container\\BindingResolutionException",

Как я могу это исправить?

🤔 А знаете ли вы, что...
Laravel предоставляет инструменты для многопользовательских приложений и ролевой системы.


2
50
1

Ответ:

Решено

В Laravel 11 вам необходимо зарегистрировать свое промежуточное программное обеспечение в файле bootstrap/app.php.

->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'modals' => \App\Http\Middleware\ModalsMiddleware::class,
        ]);
    })

Для получения более подробной информации посетите официальную документацию.

Вот как выглядит полный код.

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__ . '/../routes/web.php',
        commands: __DIR__ . '/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'modals' => \App\Http\Middleware\ModalsMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Интересные вопросы для изучения

Laravel – запрос выполняется дваждыПереключение панели навигации: активная проблемаПроблема с параметром маршрута Laravel: отсутствует обязательный параметр для [Route: edit_mahasiswa]Можно ли передать идентификатор маршруту в laravel, если нет модели с этим идентификатором, используя отсутствующую функцию?Как реализовать обновление поставщика услуг в руководстве по обновлению Laravel 11Промежуточное ПО .NET 8 неожиданно меняет код состояния на 204 после _next(context)Пользовательское промежуточное программное обеспечение Rails не распознается в GH CIОшибка промежуточного программного обеспечения Laravel: аргумент № 1 ($content) должен иметь тип ?string, задан Illuminate\Routing\RedirectorЕсть ли способ передать мою константу middleware.ts, которая проверяет, вошел ли пользователь в другой API, логику домена или page.tsx? (также открыт для новых предложений)Как написать промежуточное программное обеспечение или перехватчик SvelteKit для выборки как на сервере, так и на клиенте?