【问题标题】:Where to place business logic is Symfony 2 model layer?Symfony 2 模型层在哪里放置业务逻辑?
【发布时间】:2013-03-04 05:02:25
【问题描述】:

我正在将旧代码库迁移到 Symfony 2.2 框架。

在我的旧代码中,我的 Article 实体有一个方法 getUrl(),它返回当前文章的 URL。

在 Symfony 中,我必须使用 Router 服务来生成这样的 URL。

我无法从实体内部访问路由器,因为这是一种不好的做法,而且框架并不真正支持。

我可以使用 Twig 帮助器 path() 从 Twig 模板本身调用路由器,并提供构造 URL 所需的所有参数(来自 Article 实例)。但是这种方法不是很好,因为如果我决定更改 URL 格式规则 - 我将不得不找到所有这些调用并重写它们(不是很DRY)。

我真的想在这里保存业务逻辑封装,而不是将所有胆量都拉到视图层。

在这种情况下我应该如何处理?

【问题讨论】:

    标签: symfony model symfony-2.2


    【解决方案1】:

    在您的服务层中创建一个ArticleManager 类,并在那里处理任何业务逻辑。您可以通过依赖注入将路由器传递给它。

    对于您的示例,ArticleManager 将有一个getUrl(Article $article) 方法,该方法将使用路由器实例(您通过__construct 或单独的setter 方法注入)根据$article 的属性生成Url,并返回它。

    此方法将确保您的业务逻辑不会污染视图或控制器层。

    请务必阅读Service Container docs

    【讨论】:

    • 感谢阿姆斯!我正在考虑这种方法,只需要更有经验的人确认)我不确定我是否真的对管理其他类的模型实体感到满意,但看起来这只是可行的选择。
    • 如果您来自 Active Record ORM,这绝对感觉像是一种外国方法。但随着时间的推移,您会欣赏关注点的分离,并想知道您以前是如何管理的 ;-)
    • @SlavaFominII 这是一个很好的解决方案,但是,如果您有相同的“模型”对象,请将它们集中到同一个 Manger 中,否则您将为您的每个实体都有一个管理器(因此,一个服务)应用程序,这有时是不可取的
    • @DonCallisto 这就是这些管理器对象的美妙之处 - 虽然通常用于管理一个实体,但没有什么能阻止您使用尽可能多的实体来执行业务任务。
    • @Arms:没有人告诉他出于特殊原因他不做,我只是告诉如果你有一个可以与另一个等效的模型对象,最好创建一个唯一的管理器。当然,这是我的观点