【问题标题】:Accessing route parameters in middleware in Slim 4在 Slim 4 中访问中间件中的路由参数
【发布时间】:2020-10-22 03:08:47
【问题描述】:

我想知道如何在 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 中我们可以do it accessing attributes of request object,但是,它在 Slim 4 中不起作用。路由对象的属性包含以下条目:

  • __routingResults__
  • __route__
  • __basePath__

这些似乎都不包含参数。

【问题讨论】:

    标签: php slim slim-4


    【解决方案1】:

    您需要的文件已记录在 here。您可以使用中间件中的请求对象创建路由上下文和路由对象本身。请记住,您必须添加路由中间件才能使其正常工作。这是一个例子:

    <?php                                                                                                                                                                    
    use Slim\Factory\AppFactory;                                                                                                                                             
    use Slim\Routing\RouteContext;                                                                                                                                           
    
    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 3 升级后我无法弄清楚如何执行此操作。谢谢。
    猜你喜欢
    • 2015-02-14
    • 2013-07-18
    • 1970-01-01
    • 2017-03-06
    • 2013-12-14
    • 2022-06-29
    • 2015-08-12
    • 2018-12-23
    • 2016-06-02
    相关资源
    最近更新 更多