繁体   English   中英

Slim 3框架-将数据从中间件传递到控制器-动作args

[英]Slim 3 framework - Passing data from middleware to controller - action args

我正在使用带有slim 3的控制器/中间件版本,并且我希望从附加到组的中间件中将一些数据传递到控制器中的$ args参数-操作。

这是一些代码:

class MyController
{
    protected $container;

    public function __construct(ContainerInterface $container) {
        $this->container = $container;
    }

    public function index(Request $request, Response $response, $args) {
        return $this->container->get('renderer')->render($response, "index.html.twig", $args);
    }
}
class MyMiddleware
{
    public function __invoke(Request $request, Response $response, $next)
    {
// do some stuff to inject further down to $args some data
        return $next($request, $response);
    }
}
$app->group('/group', function () use ($app){
//routes
    })->add(new MyMiddleware());

我的用例是将东西发送到这些控制器的动作所呈现的所有视图中,因此我也可以通过其他方式做到这一点:)

谢谢。

所以您只需要将数据从中间件传递到控制器

关于什么

class MyMiddleware
{
    public function __invoke(Request $request, Response $response, $next)
    {
        $request = $request->withAttribute('myMagicArgument', 42);
        return $next($request, $response);
    }
}

然后在控制器中

class MyController
{
    //...
    public function index(Request $request, Response $response) {
        $yourAttributeFromMiddleware = $request->getAttribute('myMagicArgument');
        //...
    }
}

为了完整性,我将扩展给出@jDolba的出色答案

不幸的是,尽管它使我朝着正确的方向前进,但仍然需要进行一些尝试才能使所有功能正常运行。

基本上,如纤薄路由器文档中所述

路由回调签名由路由策略确定。 默认情况下,Slim期望路由回调接受请求,响应以及路由占位符参数数组。 这称为RequestResponse策略。 但是,您可以通过简单地使用其他策略来更改预期的路由回调签名。 例如,Slim提供了一个称为RequestResponseArgs的替代策略,该策略接受请求和响应,并将每个路由占位符作为单独的参数。 这是使用这种替代策略的示例; 只需替换默认\\Slim\\Container提供的foundHandler依赖项:

$c = new \Slim\Container();
$c['foundHandler'] = function() {
    return new \Slim\Handlers\Strategies\RequestResponseArgs();
};

$app = new \Slim\App($c);
$app->get('/hello/{name}', function ($request, $response, $name) {
    return $response->write($name);
});

您可以通过实现\\Slim\\Interfaces\\InvocationStrategyInterface来提供自己的路由策略。

但是 ,对于将一些标准化数据注入$args[]数组的任务,默认的\\Slim\\Handlers\\Strategies\\RequestResponse类会执行减去注入数据所需的所有操作。

因此,我只是扩展了该类:

<?php

namespace MyProject\Handlers\Strategies;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

use \Slim\Handlers\Strategies\RequestResponse;

class SomeNewInvocationStrategy extends RequestResponse
{
    /**
     * Invoke a route callable.
     *
     * @param callable               $callable The callable to invoke using the strategy.
     * @param ServerRequestInterface $request The request object.
     * @param ResponseInterface      $response The response object.
     * @param array                  $routeArguments The route's placholder arguments
     *
     * @return ResponseInterface|string The response from the callable.
     */
    public function __invoke( callable $callable, ServerRequestInterface $request, ResponseInterface $response, array $routeArguments)
    {
        $routeArguments['test'] = 'testing testing 123';
        return parent::__invoke( $callable, $request, $response, $routeArguments );
    }
} 

我的容器声明如下所示:

<?php

use Slim\App;

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

    $container['foundHandler'] = function() {
        return new MyProject\Handlers\Strategies\SomeNewInvocationStrategy();
    };
}

然后,在我所有的控制器操作中,我都可以访问$args['test'] 此外,这可以直接传递到任何Twig视图。

这对于诸如访问控制之类的任务很有用,在该任务中,我总是希望在处理请求之前先加载用户的角色,但是我敢肯定会有很多其他用例。

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM