好的,问题是:
我有一些'订单'实体,它有'status'属性。在更改状态时,我希望其他一些对象被告知此事件,因此我决定使用Observer模式。其中一位观察员通过电子邮件通知客户。现在我想从一些树枝模板中渲染电子邮件文本。正如我从本书中获得的那样,控制器中的渲染模板是通过“模板化”服务完成的。
所以问题如下:我如何在我的Observer类中访问'模板'服务?
规格: 我被告知,要将我的观察者作为一项服务来实施,但我不确定那是不是。我试图解决这个问题,这是我的选择:
使用注册表。铁路直,坚硬的解决方案。我想它错过了DI和Service Container的全部要点。这个解决方案的一大优点是,我可以从我的应用程序的任何位置访问所有常见服务。
通过构造函数或通过setter从上下文传递所需的服务。这更像是Sf2精神。还有另一个问题列表,与此问题字段无关。
使用观察者作为服务。我不太确定'关于这个选项'cos,在写的书中,该服务是一个常见的功能,我不认为观察具有多个离散属性的实体是一个共同的任务。
我正在寻找一个Sf2精神解决方案,它将分布在整个项目中,所以所有答案都有一个解释。
答案 0 :(得分:1)
与Symfony2项目中的任何其他服务一样,您可以通过依赖项注入器容器从其他类中访问它。基本上你要做的是将你的观察者类注册为服务,然后将模板服务注入你的观察者服务。请参阅injecting services的文档。
如果您不熟悉Symfony如何处理依赖注入,我建议您阅读文档的整个章节 - 这非常有用。此外,如果要查找为应用程序注册的所有服务,可以使用控制台命令container:debug
。您也可以在此之后附加服务名称,以查看有关该服务的详细信息。
修改的
我读了你对这个问题的修改,但仍然建议你去DI路线。那个是 Symfony2精神:)你担心你的观察者不够普及而无法用作服务,但没有硬性规则说“你必须在X地点使用这段代码为了使它“共同”“。
使用DIC还有另一个巨大的好处 - 它可以为您处理其他依赖项。假设模板服务有3个服务注入其自身。使用DIC时,您无需担心模板服务的依赖关系 - 它们是为您处理的。你所关心的只是告诉它“将模板服务注入其他服务”,Symfony负责所有繁重的工作。
如果您真的反对将观察者定义为服务,只要您处于容器感知上下文中,就可以使用构造函数或setter注入。