Как добавить промежуточное ПО для конкретного маршрута на Slim Framework - PullRequest
1 голос
/ 19 июня 2019

Я строю API, используя Slim Framework, и я написал скрипт, который создает маршруты и динамически добавляет промежуточное ПО. Проблема в том, что по какой-то причине маршруты применяются к каждому маршруту в приложении. Как я могу применить промежуточное ПО только для одного маршрута?

Это файл route.cfg

#[HTTP Verb] [Route] [Controller::method] [middleware|middleware]

GET /usuario/autenticar UsuarioController:autenticar log
GET /usuario/listar[/{id}] UsuarioController:listar log|autenticar
GET /usuario/encerrarSessao UsuarioController:encerrarSessao log|autenticar
POST /usuario/cadastrar UsuarioController:cadastrar log|autenticar
PUT /usuario/editar UsuarioController:editar log|autenticar
DELETE /usuario/deletar UsuarioController:deletar log|autenticar

Это скрипт, который читает файл маршрутов

<?php

use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;

return function (App $app) {
    $container = $app->getContainer();

$routesFile = file(__DIR__ . '/routes.cfg');

foreach ($routesFile as $fileLine) {
    $fileLine = str_replace("\n", "", $fileLine);
    $fileLine = preg_replace('/\s+/', ' ', $fileLine);

    $args = explode(' ', $fileLine);

    if (strpos($fileLine, '#') !== false || count($args) < 3) continue;

    $verb = array_key_exists(0, $args) ? $args[0] : null;
    $endpoint = array_key_exists(1, $args) ? $args[1] : null;
    $controller = array_key_exists(2, $args) ? $args[2] : null;
    $routeMiddleware = array_key_exists(3, $args) ? $args[3] : null;

    $app->{$verb}($endpoint, "$controller");

    if (isset($routeMiddleware) && strlen($routeMiddleware) > 0) {
        $routeMiddleware = trim($routeMiddleware);

        $middlewares = explode('|', $routeMiddleware);

        foreach ($middlewares as $middlewareFunction) {
            $app->add(function($request, $response, $next) use ($middlewareFunction) {
                return Middleware::{$middlewareFunction}($request, $response, $next);
            });
        }
    }
}

};

А это мой класс Middleware

    <?php

use Slim\App;

class Middleware {
    public static function autenticar($request, $response, $next) {
        //Do stuff...
        return $next($request, $response);
    }

    public static function log($request, $response, $next) {
        //Do stuff...
        return $next($request, $response);
    }
}

1 Ответ

1 голос
/ 19 июня 2019

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

$app->add(function($request, $response, $next) use ($middlewareFunction) {

Регистрация промежуточного программного обеспечения для отдельного маршрута работает следующим образом:

$this->get('/', \App\Action\HomeIndexAction::class)
    ->add(MyMiddleware::class);

Я бы попробовал изменить ваш код следующим образом:

<?php

use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;

return function (App $app) {
    $routesFile = file(__DIR__ . '/routes.cfg');

    foreach ($routesFile as $fileLine) {
        $fileLine = str_replace("\n", '', $fileLine);
        $fileLine = preg_replace('/\s+/', ' ', $fileLine);

        $args = explode(' ', $fileLine);

        if (strpos($fileLine, '#') !== false || count($args) < 3) {
            continue;
        }

        $verb = $args[0] ?? null;
        $endpoint = $args[1] ?? null;
        $controller = $args[2] ?? null;
        $routeMiddleware = $args[3] ?? null;

        // This line has changed
        $route = $app->{$verb}($endpoint, $controller);

        if (isset($routeMiddleware) && $routeMiddleware !== '') {
            $routeMiddleware = trim($routeMiddleware);

            $middlewares = explode('|', $routeMiddleware);

            foreach ($middlewares as $middlewareFunction) {
                // This line has changed
                $route->add(function ($request, $response, $next) use ($middlewareFunction) {
                    return Middleware::{$middlewareFunction}($request, $response, $next);
                });
            }
        }
    }
};
...