Symfony2中的策略模式

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,所以我还要记住这一点.

gil*_*den 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.
}
Run Code Online (Sandbox Code Playgroud)

所以基本上每个策略都会扩展ContainerAwarepage.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)