2016-07-29 15 views
0

Ich benutze zend-expressive und ich möchte Daten von einer Middelware zu einer anderen weitergeben. z.B. in config/routes.php Ich habeWeitergabe von Daten zwischen Middelware

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

in Api \ V1 \ Aktion \ ItemListAction ich einige Daten aus Datenbanken preparin und Ich mag

$ itemsList an eine andere Middel passieren
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); 
} 

und in Application \ Middleware \ JsonRenderMiddleware würde ich $ itemsList mögen und Rückkehr im jSON-Format:

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

Wie ist der beste Weg? Nur commandBus oder ist eine andere Lösung in diesem Rahmen?

Antwort

3

Sie könnten die Attribute der $request verwenden.

In Api\V1\Action\ItemListAction könnten Sie tun

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

und dann rufen Sie sie in Application\Middleware\JsonRenderMiddleware mit

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

Der einzige Nachteil dieser Lösung ist, dass Sie eine Abhängigkeit zwischen den beiden Middleware erstellen, weil die zweite brechen, wenn die $request kein list Attribut gehen

+0

es funktioniert nicht:/$ response-> getAttribute ('list'); gibt immer null zurück, auch wenn ich versuche, es gleich zu bekommen, nachdem ich es in derselben Middleware gesetzt habe. – quentino

+0

Vielleicht kann ich die Idee der Middleware nicht richtig verstehen. Ich dachte, dass ich Middleware wie eine Servicekette verwenden kann, um Daten auf viele Arten zu verarbeiten, um erwartete Daten zu erhalten. Wie in diesem Fall möchte ich verschiedene Middleware verwenden, um z.B. JSON oder HTML-Antwort, aber verwenden Sie diese Middleware, um Daten aus der Datenbank abzurufen. – quentino

+0

es gab einen Fehler, 'getAttribute' muss auf' $ request' aufgerufen werden, nicht auf '$ response' – marcosh

0

Es gibt mehrere Möglichkeiten, hier hat.

Normalerweise würden Sie eine Zend \ Diactoros \ Antwort \ JsonResponse in Ihrer Aktion zurückgeben. Normalerweise möchten Sie diese Klasse erweitern und diese Liste in etwas Nützlicheres umwandeln. Ich würde die Anfrage nicht verwenden, um solche Daten zu übergeben.

Allerdings sehe ich, dass Sie einen Befehlsbus verwenden. Ich habe noch nicht damit gearbeitet, aber vielleicht möchten Sie einen Blick auf https://github.com/prooph/proophessor-do werfen. Das ist ein schönes Beispiel dafür, wie sie CQRS und Event Sourcing mit expressiven verwenden.

Verwandte Themen