Symfony2中的战略模式

我试图构建简单的服务来渲染各种类型的页面。 基本概念是有这样的东西:

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

...这将被设计为战略模式。 页面类型将实现与render方法的接口,并且page.service会调用它。 问题是我想在页面类型类中使用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.
}

所以基本上每个策略都会扩展ContainerAware ,并且page.service会注入容器。


编辑

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

class MyPageService {

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

        // do stuff
    }
}

服务正是你想要的。 能够为有问题的特定策略注入依赖关系。 然后将特定策略注入控制器(也可以是在运行时选择策略的动态渲染器)。

ContainerAware是一个非常糟糕的做法,它将有问题的对象耦合到容器中的所有服务。 因此,我强烈建议避免它。

链接地址: http://www.djcxy.com/p/57175.html

上一篇: Strategy pattern in Symfony2

下一篇: How to document JavaScript/CoffeeScript data structures