Laravel Почему промежуточное ПО не работало в некоторых API - PullRequest
1 голос
/ 27 мая 2020

Я определил два промежуточных ПО: EnableCORSRequest и EnableAllCORSRequest. EnableCORSRequest - это глобальное промежуточное ПО, я загружал его в Kernel.php.

часть кода Kernel.php

    $protected $middleware = [
        // ... other middleware
        EnableCORSRequest::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            // ... some middleware, I don't use web.php
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
            'cors', // this is EnableCORSRequest
        ],

        'api_no_throttle' => [
            'bindings',
            'cors', // this is EnableCORSRequest
        ]
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        // ... others
        'cors' => EnableCORSRequest::class,
        'no_cors' => EnableAllCORSRequest::class,
    ];

Я использую его в api.php:

// I don't want this api to be blocked by cors, so use this middleware
Route::post('/merchant/wallet/withdraw', 'Wallet@withdraw')
    ->middleware('no_cors');

Но на самом деле no_cors не делал работает, нет ошибок, нет предупреждений.
Для теста я добавил сообщение журнала в эти два класса

class EnableCORSRequest
{
    public function handle($request, Closure $next)
    {
        // add this const definition, because to avoid that if this middleware loaded after another one, the CORS option may be overwritten
        if(defined('ALLOW_CORS_REQUEST')){
            return $next($request);
        }

        \Log::info('enable_cors');

        // ......
    }
}



class EnableAllCORSRequest
{
    public function handle($request, Closure $next)
    {
        define('ALLOW_CORS_REQUEST', 1);

        \Log::info('disable_cors');

        $response = $next($request);

        $response->header('Access-Control-Allow-Origin', '*');
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
        $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'true');

        return $response;
    }
}

, затем я обращаюсь к этому API через браузер и смотрю свой файл журнала, просто [2020-05-27 15:13:36] test.INFO: enable_cors

1 Ответ

1 голос
/ 27 мая 2020

Промежуточное ПО работает шаг за шагом и один за другим Итак, первое глобальное промежуточное программное обеспечение работает, и кажется, что всегда ALLOW_CORS_REQUEST никогда не устанавливается, когда приложение go имеет класс EnableCORSRequest, потому что он запускается первым, поэтому вам следует изменить свой сенарио.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...