在Slim 4中访问中间件中的路由参数。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Slim 4中访问中间件中的路由参数。相关的知识,希望对你有一定的参考价值。

我想知道如何在Slim 4中访问中间件的路由参数。

如果我定义了一个带有占位符和中间件的路由,那么我想在Slim 4中访问路由参数。

<?php

// ...

$app
    ->get('/{userId}', Controller::class)
    ->add(Middleware::class);

我想访问以下参数的值 {userId} 在控制器被输入之前,我们可以从中间件中获取信息。

class Middleware
{
    function __invoke($request, $handler)
    {
        // Resolve user ID in this scope?..
        return $handler->handle($request);
    }
}

我知道在Slim 3中,我们可以 访问请求对象的属性但是,在Slim 4中无法使用。路由对象的属性中包含以下项目。

  • __routingResults__
  • __route__
  • __basePath__

其中不包含参数

答案

你需要的是文档 此处. 你可以使用中间件中的请求对象创建路由上下文和路由对象本身。只需记住,你必须添加路由中间件才行。下面是一个例子。

<?php                                                                                                                                                                    
use SlimFactoryAppFactory;                                                                                                                                             
use SlimRoutingRouteContext;                                                                                                                                           

require __DIR__ . '/../vendor/autoload.php';                                                                                                                             

// Create App                                                                                                                                                            
$app =  AppFactory::create();                                                                                                                                            

Class Middleware                                                                                                                                                         
{                                                                                                                                                                        
    function __invoke($request, $handler)                                                                                                                                
    {                                                                                                                                                                    
        $routeContext = RouteContext::fromRequest($request);                                                                                                             
        $route = $routeContext->getRoute();                                                                                                                              
        // Resolve user ID in this scope                                                                                                                                 
        $id = $route->getArgument('id');                                                                                                                                 
        $response = $handler->handle($request);                                                                                                                          
        $response->getBody()->write("Route parameter value (in middleware): {$id}");                                                                                     
        return $response;                                                                                                                                                
    }                                                                                                                                                                    
}                                                                                                                                                                        

$app->get('/{id}', function($request, $response, $args) {                                                                                                                
    return $response;                                                                                                                                                    
})->add(Middleware::class);                                                                                                                                              

$app->addRoutingMiddleware();                                                                                                                                            

// Run app                                                                                                                                                               
$app->run();

现在试着访问 /1/2 而你看到中间件是知道参数值的。

以上是关于在Slim 4中访问中间件中的路由参数。的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.3 的中间件中访问路由 URL 参数

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

SLIM框架路由验证v2与v3

路由组苗条框架

找不到 Slim jwt 令牌(由 axios 请求发送)

如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量