在中间件之间传递数据

Passing data between middelware

我使用 zend-expressive,我想将数据从一个中间件传递到另一个中间件。 例如在 config/routes.php 我

[
    'name' => 'v1.item.list',
    'path' => '/item',
    'allowed_methods' => ['GET'],
    'middleware' => [
        Api\V1\Action\ItemListAction::class,
        Application\Middleware\JsonRenderMiddleware::class
    ]
],

在 Api\V1\Action\ItemListAction 我正在准备一些来自数据库的数据,我想将 $itemsList 传递给另一个中间件

public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null)
{
    $parameters = new ListParameters($request->getQueryParams());
    $itemsList = $this->commandBus->handle(new ItemListCommand($parameters));
    return $next($request, $response);
}

并在 Application\Middleware\JsonRenderMiddleware 中,我想以 json 格式获取 $itemsList 和 return:

public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null)
{
    return new JsonResponse($itemsList);
}

如何是最好的方法?仅 commandBus 还是此框架中的其他解决方案?

您可以使用 $request 的属性。

Api\V1\Action\ItemListAction你可以做到

$request = $request->withAttribute('list', $itemsList);

然后使用

Application\Middleware\JsonRenderMiddleware中检索它

$itemsList = $request->getAttribute('list');

此解决方案的唯一缺点是您在两个中间件之间创建了依赖关系,因为如果 $request 没有 list 属性[=15=,第二个就会中断]

这里有几种方法。

通常你会 return 一个 Zend\Diactoros\Response\JsonResponse 在你的行动中。通常您希望扩展 class 并将该列表转换为更有用的内容。我不会使用请求来传递这样的数据。

不过我看到您使用的是命令总线。我还没有使用过它,但你可能想看看 https://github.com/prooph/proophessor-do。这是一个很好的例子,说明他们如何使用 CQRS 和具有表现力的事件源。