我正在尝试构建用于呈现各种类型页面的简单服务。基本概念是这样的:
$somePageType = new PageType(...);
$this->get('page.service')->render($somePagetype);
...将被设计为Strategy pattern。网页类型会使用render
方法实现界面,而page.service
会调用它。问题是我想在页面类型类中使用Doctrine。我有什么选择?我想避免为每个类创建服务。这甚至可能吗?是否有可能在没有服务的情况下使容器更容易识别?可能在将来,某些页面类型可能需要的不仅仅是Doctrine,所以我还要记住它。
答案 0 :(得分:3)
服务正是您想要的。能够为所讨论的特定策略注入依赖关系。然后将特定策略注入控制器(也可以是在运行时选择策略的动态渲染器)。
ContainerAware是一种非常糟糕的做法,它将有问题的对象与容器中所有的服务结合起来。因此,我强烈建议避免它。
答案 1 :(得分:1)
我假设PageType
是战略类的一个例子。在这种情况下,您可以通过page.service
注入依赖项,而不需要将策略定义为服务。
每个策略可能取决于不同的对象,因此我猜你可以制作它们ContainerAware
。这是一个如何做的例子
// This is the page.service class
class MyPageService {
public function render(PageTypeInterface $page_type) {
$page_type->setContainer($this->container);
// do stuff
}
}
// This is the type strategy
class MyStrategyType extends ContainerAware implements PageTypeInterface {
// you can access the container after MyPageService has injected it.
}
所以基本上每个策略都会扩展ContainerAware
而page.service
会注入容器。
修改强>
如果您的所有策略都依赖于相同的服务,我会注入它们而不是整个容器。
class MyPageService {
public function render(PageTypeInterface $page_type) {
$page_type->setService($this->container->get('my_service'));
// do stuff
}
}