我目前正在学习zend表达式,我可以看到有关如何访问路由/动作中的中间件的几个选项。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进入行动的这两种方法的优点/缺点是什么?
如果我有一个UserService处理从数据库中检索用户,因此可能需要多个操作/路由,我最好是修改HomePageAction工厂(以及任何需要它的其他人)来接受UserService ?
即
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的是应用广泛进行。我的直觉(写出这个问题后)是真的,这是一个服务,而不是真正的中间件,所以我应该真的在修改HomePageAction工厂并添加UserService,而不是做那些看起来更简单和使用属性ala FlashMessenger。但如果上师能够帮助澄清这一点,这将非常方便。
非常感谢提前。
感谢您花时间回复。这个特定的UserService不处理认证,因此不需要修改请求。所以我认为我已经在正确的方向上注入了行动。感谢您的理智检查和澄清。 – Neddage