1

我使用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 我想获取 $itemsList 并以 json 格式返回:

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

最好的方法是怎样的?只有 commandBus 还是这个框架中的其他解决方案?

4

2 回答 2

3

您可以使用$request.

Api\V1\Action\ItemListAction你可以做

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

然后在Application\Middleware\JsonRenderMiddleware使用中检索它

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

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

于 2016-07-29T14:02:41.403 回答
0

有几种方法可以去这里。

通常你会在你的操作中返回一个 Zend\Diactoros\Response\JsonResponse。通常,您希望扩展该类并将该列表转换为更有用的东西。我不会使用请求来传递这样的数据。

但是我看到您正在使用命令总线。我还没有使用过,但你可能想看看https://github.com/prooph/proophessor-do。这是一个很好的例子,说明他们如何使用 CQRS 和 Event Sourcing 来表达。

于 2016-07-29T20:07:30.340 回答