Symfony2中的策略模式

时间:2012-01-13 17:13:16

标签: php design-patterns symfony

我正在尝试构建用于呈现各种类型页面的简单服务。基本概念是这样的:

$somePageType = new PageType(...);
$this->get('page.service')->render($somePagetype);

...将被设计为Strategy pattern。网页类型会使用render方法实现界面,而page.service会调用它。问题是我想在页面类型类中使用Doctrine。我有什么选择?我想避免为每个类创建服务。这甚至可能吗?是否有可能在没有服务的情况下使容器更容易识别?可能在将来,某些页面类型可能需要的不仅仅是Doctrine,所以我还要记住它。

2 个答案:

答案 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.
}

所以基本上每个策略都会扩展ContainerAwarepage.service会注入容器。


修改

如果您的所有策略都依赖于相同的服务,我会注入它们而不是整个容器。

class MyPageService {

    public function render(PageTypeInterface $page_type) {
        $page_type->setService($this->container->get('my_service'));

        // do stuff
    }
}