为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
红糖糍粑 2021-08-28 10:29:50
我正在使用 Slim Framework 构建一个 API,我编写了一个脚本来创建路由并动态添加它的中间件。问题是由于某种原因,这些路线被应用到应用程序中的每条路线。如何仅在一条路由上应用中间件?这是 route.cfg 文件#[HTTP Verb] [Route] [Controller::method] [middleware|middleware]GET /usuario/autenticar UsuarioController:autenticar logGET /usuario/listar[/{id}] UsuarioController:listar log|autenticarGET /usuario/encerrarSessao UsuarioController:encerrarSessao log|autenticarPOST /usuario/cadastrar UsuarioController:cadastrar log|autenticarPUT /usuario/editar UsuarioController:editar log|autenticarDELETE /usuario/deletar UsuarioController:deletar log|autenticar这是读取路由文件的脚本<?phpuse 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);            });        }    }}};这是我的中间件类    <?phpuse Slim\App;class Middleware {    public static function autenticar($request, $response, $next) {        //Do stuff...        return $next($request, $response);    }
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

在这种情况下,问题在于这一行为所有路由注册了中间件:


$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);

                });

            }

        }

    }

};



查看完整回答
反对 回复 2021-08-28
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信