Ond*_*ták 7 php design-patterns symfony
我正在尝试构建用于呈现各种类型页面的简单服务.基本概念是这样的:
$somePageType = new PageType(...);
$this->get('page.service')->render($somePagetype);
Run Code Online (Sandbox Code Playgroud)
......将被设计为战略模式.页面类型将实现与render方法的接口,page.service并将调用它.问题是我想在页面类型类中使用Doctrine.我有什么选择?我想避免为每个类创建服务.这甚至可能吗?是否有可能在没有服务的情况下使容器更容易识别?可能在将来,某些页面类型可能需要的不仅仅是Doctrine,所以我还要记住这一点.
我假设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.
}
Run Code Online (Sandbox Code Playgroud)
所以基本上每个策略都会扩展ContainerAware并page.service注入容器。
编辑
如果您的所有策略都依赖于相同的服务,我会注入它们而不是整个容器。
class MyPageService {
public function render(PageTypeInterface $page_type) {
$page_type->setService($this->container->get('my_service'));
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)