私は現在、表現力豊かな zend を学んでおり、ルート/アクション内でミドルウェアにアクセスする方法についていくつかのオプションを見ることができます。
表現力豊かなスケルトン アプリケーションでは、コンテナーが注入される HomePageFactory があり、コンテナーからルーター、テンプレート エンジンなどがプルされ、これらを使用して新しい HomePageAction クラスが構築され、返されます。
例えば:
class HomePageFactory
{
public function __invoke(ContainerInterface $container)
{
$router = $container->get(RouterInterface::class);
$template = ($container->has(TemplateRendererInterface::class))
? $container->get(TemplateRendererInterface::class)
: null;
return new HomePageAction($router, $template);
}
その後、フラッシュメッセンジャーが必要になり、次のことに出会いました。
class SlimFlashMiddlewareFactory
{
public function __invoke($container)
{
return function ($request, $response, $next) {
// Start the session whenever we use this!
session_start();
return $next(
$request->withAttribute('flash', new Messages()),
$response
);
};
}
}
したがって、これは少し異なり、属性を介してリクエストにミドルウェアを追加しています。次に、次のような方法で必要な場所に取得できます。
$flashMessenger = $request->getAttribute('flash');
本当に私の質問は、FlashMessenger をアクションに組み込むこれら 2 つの方法の長所と短所は何ですか?
データベースからのユーザーの取得を処理する UserService があるため、複数のアクション/ルートで必要になる可能性がある場合、UserService を受け入れるように HomePageAction と Factory (およびそれを必要とするその他のもの) を変更したほうがよいでしょうか?
すなわち
class HomePageFactory
{
public function __invoke(ContainerInterface $container)
{
$router = $container->get(RouterInterface::class);
$template = ($container->has(TemplateRendererInterface::class))
? $container->get(TemplateRendererInterface::class)
: null;
$userService = $container->get(App\UserService::class);
return new HomePageAction($router, $template, $userService);
}
または、FlashMessenger の仕組み (管理が少し簡単に思えます) を使用して、属性を介してリクエストに追加し、必要に応じてその方法でアクセスする方がよいでしょうか?
すなわち
$userService = $request->getAttribute('UserService');
後者のオプションにパフォーマンスの問題があるかどうか疑問に思っていますが、UserServer がアプリケーション全体ではなく、特定のルートに対してのみこの方法で実行できることは理解しています。
私の直感 (この質問を書いた後) は、これは実際にはサービスであり、真のミドルウェアではないので、簡単に見えることを実行して属性 ala FlashMessenger を使用するのではなく、HomePageAction & Factory を変更して UserService をそのように追加する必要があるということです。 . しかし、教祖がこれを明確にするのを助けることができれば、それは非常に便利です.
よろしくお願いします。