【问题标题】:How to avoid setters using Symfony with admin panel creator?如何避免 setter 将 Symfony 与管理面板创建者一起使用?
【发布时间】:2016-05-18 06:39:16
【问题描述】:

我想避免我的实体中的 getter/setter 地狱(原因如下:http://ocramius.github.io/doctrine-best-practices/#/53),但两种最流行的管理面板生成器:

需要 getter 和 setter 来渲染视图。

我的想法是创建 DTO 对象 (http://ocramius.github.io/doctrine-best-practices/#/57),然后使用命名构造函数创建实体。我想在我的服务中调用命名构造函数。强制管理面板生成器使用我的 DTO 来持久化/更新数据的最佳方法是什么,你能给我一个想法和/或在这种情况下的良好实践示例吗?

我想象的唯一方法是使用 DTO 代替真实实体,调用 prePersist/preUpdate 钩子并使用自定义服务,但看起来很混乱。

【问题讨论】:

  • 关于强制大多数 crud 生成器不使用 getter/setter 的唯一方法是不使用 crud 生成器。我同情您不使用 getter/setter 的愿望。我也不喜欢他们。但摆脱它们基本上意味着编写你自己的软件,当然要小心你在互联网上阅读的内容。您的链接有一些优点,也有一些非常糟糕的(“急切的加载是无用的”!!!)。他也没有说明如何将 dto 与表单组件一起使用。
  • 好问题和有趣的幻灯片,但我不确定 DTO 是否可以在所有情况下替换实体。您肯定可以使用 SonataAdminBundle 找到替代方案,它允许您对列表进行自定义查询。我真的不知道如何在创建/编辑表单中避免设置器。前/后挂钩将起作用,但它是有限的。在 Sonata github.com/sonata-project/SonataDoctrineORMAdminBundle/issues/… 中看到这个有趣的问题,有 DTO 实现的例子。
  • @Cerad 你看到这个演示文稿的作者了吗?这是奥克拉米乌斯——教义的发明者。如果你看到他的整个演讲,你会完全同意他的看法。你可以在这里找到它:vimeo.com/134178140
  • @sredni - 我确实认识作者,已经多次观看演示文稿并且非常尊重他的意见。但是,这个特定问题涉及使用 CRUD 生成工具的 CRUD 类型应用程序。他的基于 DTO 的方法根本不适用。
  • @Cerad 可能是因为 CRUD 不包括 DDD,反之亦然

标签: symfony doctrine-orm domain-driven-design dto


【解决方案1】:

DDD 最重要的方面之一是正确识别您的有界上下文(通常与您的子域对齐)并确定在其中使用的适当技术和架构。

管理面板听起来像是一个通用的东西,本质上是非常 CRUD。如果是这种情况,那么不要试图与之抗争并在该 BC 中接受 CRUD。尝试在不需要的 BC 中实现纯域模型会使事情变得比需要的更复杂。

但是,如果您确定域模型的复杂性是合理的,那么我建议您不要使用代码生成器。对复杂领域的现实进行正确建模并非易事,当然也不是工具可以完成的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多