如何将中间件添加到 Slim Framework 上的特定路由

我正在使用 Slim Framework 构建一个 API,我编写了一个脚本来创建路由并动态添加它的中间件。问题是由于某种原因,这些路线被应用到应用程序中的每条路线。如何仅在一条路由上应用中间件?


这是 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);

            });

        }

    }

}


};

这是我的中间件类


    <?php


use Slim\App;


class Middleware {

    public static function autenticar($request, $response, $next) {

        //Do stuff...

        return $next($request, $response);

    }

红糖糍粑
浏览 110回答 1
1回答

江户川乱折腾

在这种情况下,问题在于这一行为所有路由注册了中间件:$app->add(function($request, $response, $next) use ($middlewareFunction) {为单个路由注册中间件的工作方式如下:$this->get('/', \App\Action\HomeIndexAction::class)&nbsp; &nbsp; ->add(MyMiddleware::class);我会尝试像这样更改您的代码:<?phpuse Slim\App;use Slim\Http\Request;use Slim\Http\Response;return function (App $app) {&nbsp; &nbsp; $routesFile = file(__DIR__ . '/routes.cfg');&nbsp; &nbsp; foreach ($routesFile as $fileLine) {&nbsp; &nbsp; &nbsp; &nbsp; $fileLine = str_replace("\n", '', $fileLine);&nbsp; &nbsp; &nbsp; &nbsp; $fileLine = preg_replace('/\s+/', ' ', $fileLine);&nbsp; &nbsp; &nbsp; &nbsp; $args = explode(' ', $fileLine);&nbsp; &nbsp; &nbsp; &nbsp; if (strpos($fileLine, '#') !== false || count($args) < 3) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; $verb = $args[0] ?? null;&nbsp; &nbsp; &nbsp; &nbsp; $endpoint = $args[1] ?? null;&nbsp; &nbsp; &nbsp; &nbsp; $controller = $args[2] ?? null;&nbsp; &nbsp; &nbsp; &nbsp; $routeMiddleware = $args[3] ?? null;&nbsp; &nbsp; &nbsp; &nbsp; // This line has changed&nbsp; &nbsp; &nbsp; &nbsp; $route = $app->{$verb}($endpoint, $controller);&nbsp; &nbsp; &nbsp; &nbsp; if (isset($routeMiddleware) && $routeMiddleware !== '') {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $routeMiddleware = trim($routeMiddleware);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $middlewares = explode('|', $routeMiddleware);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach ($middlewares as $middlewareFunction) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // This line has changed&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $route->add(function ($request, $response, $next) use ($middlewareFunction) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Middleware::{$middlewareFunction}($request, $response, $next);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }};
打开App,查看更多内容
随时随地看视频慕课网APP