ベスト・プラクティスでは、リクエスト・オブジェクトを使用してミドルウェア間でデータを受け渡しています。応答はクライアントに送信されるもので、これをきれいに保つ必要があります。リクエストはサーバー上にのみ存在し、(機密データ)属性を追加して渡すことができます。何かがうまくいかない場合や、カスタムデータを削除する前に早めに返信した場合は、あなたの応答が「きれい」なので問題はありません。
また、データを渡す必要がある場合:ミドルウェアは常に設定から取得した順番で実行されます。これにより、MiddlewareXの要求オブジェクトにMiddlewareYが設定したデータが含まれていることを確認できます。
更新: aリクエストでデータを渡す方法の例。
ミドルウェア2は、ミドルウェア4が途中で必要なデータを設定するために使用できるメッセンジャーオブジェクトを設定します。
<?php
namespace Middleware;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
class Middleware2
{
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
{
$messenger = new Messenger();
// Do something else before next middleware
if ($next) {
$response = $next($request->withAttribute(Messenger::class, $messenger), $response);
}
// Do something with the Response after it got back
// At this point the $messenger object contains the updated data from Middleware4
return $response->withHeader('Content-Language', $locale);
}
}
ミドルウェア4はメッセンジャーオブジェクトを取得し、その値を更新します。
<?php
namespace Middleware;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
class Middleware4
{
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
{
$messenger = $request->getAttribute(Messenger::class);
$messenger->info('going in');
// Do something else before next middleware
if ($next) {
$response = $next($request->withAttribute(FlashMessenger::class, $messenger), $response);
}
// Do something with the Response after it got back
$messenger->info('going out');
return $response->withHeader('Content-Language', $locale);
}
}
これは私がやっていることですが、「属性」のようなものがあれば良いと思いますので、送信前にこれらのカスタムヘッダーを応答から削除する必要はありません。 – tornellas