【发布时间】:2016-05-18 06:39:16
【问题描述】:
我想避免我的实体中的 getter/setter 地狱(原因如下:http://ocramius.github.io/doctrine-best-practices/#/53),但两种最流行的管理面板生成器:
- 奏鸣曲和DoctrineORMAdminBundle
- https://github.com/javiereguiluz/EasyAdminBundle
需要 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