我应该在 Doctrine 2 中使用 YAML/XML 还是注解映射?

Posted

技术标签:

【中文标题】我应该在 Doctrine 2 中使用 YAML/XML 还是注解映射?【英文标题】:Should I use YAML/XML or annotation mapping in Doctrine 2? 【发布时间】:2012-09-21 09:45:51 【问题描述】:

我在 Symfony 框架中使用 Doctrine 2 作为 ORM。对实体使用基于注释的映射,我将不得不编写大量代码(setter 和 getter、映射信息等)。使用 YAML/XML,我不必只写列定义和元数据。在 Doctrine 文档中,他们主要使用示例中的注释,很少使用 YAML 或 XML。

我应该使用 YAML/XML 还是注释?

对于注释,我可以在http://docs.doctrine-project.org/en/latest/reference/annotations-reference.html 找到每个注释的文档。不过,我在 YAML 或 XML 中找不到注释的等价物;如何将注释转换为等效的 YAML/XML 表达式?

【问题讨论】:

【参考方案1】:

这基本上取决于偏好。

这是我的看法:

注释的优点:

更易于使用,因为它们与所描述的(属性)接近 很多示例都使用它们,正如您已经注意到的那样

yaml/xml 的优点

这使域对象保持干净,因此持久层绝对不会泄漏到域中(即使是以注释的形式)

如果您更改数据库或域,您仍然必须以任何一种形式维护它们,因此从这个角度来看,在任何方向上都没有真正的优势。

从性能的角度来看,在生产中你应该使用学说的缓存来缓存映射,所以它们在这里也是相等的。

关于这个:“我将不得不编写大量代码、setter 和 getter、映射信息”:

Doctrine 需要私有/受保护的属性,因此您仍将编写 getter 和 setter。而且您仍将在另一个地方编写映射信息。

就我个人而言,我会使用注释,因为如果需要的话,查找示例和信息会容易得多。

【讨论】:

从不使用注释。由于缺少原生注释,注释注释是一个非常丑陋的解决方法。如果您的应用程序依赖 cmets 才能正常运行,那么您做错了。使用注释注释还会使您的应用无法与 HipHop 等编译器一起使用。注释注释是唯一 具有技术缺陷的规范。 YAML 和 XML 是我唯一的选择。我们现在应该停止建议人们使用评论注释。 目前有很多 yaml 示例,仅供参考。 我知道。但默认情况下,文档中的示例仍在 php/cmets 中。这并不是什么大问题。我最喜欢 cmets 的一点是,一切都在同一个地方。此外,在一个巨大的 yaml/xml 文件中包含所有实体的配置对我来说也有点令人反感。 Also, having the config for all entities in one huge yaml/xml file is also a bit off-putting to me 我不知道你在说什么。通常,每个实体都有自己的 yaml/xml 文件。在大多数情况下(尤其是 YAML),它们甚至都不是很大。 对@Pedro 所说的话持保留态度。注释是添加元数据的一种简洁有效的方式。理想情况下,我们有一天会原生支持 Annotations,但这是我们目前最好的权宜之计。最终这一切都是偏好问题,Pinetree 在描述利弊方面做得很好。【参考方案2】:

使用注解有一个缺点。由于它们是在 cmets 上定义的(这很奇怪),因此您将无法使用预编译器(如 Zend Guard)或 some 字节码 php 缓存扩展来提高代码性能(some 其中剥离 cmets)。因为注释是唯一存在这种技术缺陷的规范,我不建议使用它。

另外,在 cmets 上写“功能性”的东西很奇怪。

XML 比 YAML 更冗长,但也更广为人知。 XML 的文档示例是所有选项中最差的。

YAML 比其他任何一种都更具可读性,但它也依赖于空间标识(有些人不喜欢)。 Symfony 默认使用 YAML 进行配置,因此许多使用 Symfony 的人选择使用 YAML 进行教义映射——这意味着 YAML 示例有很好的文档记录,并且那里有很多资源。

我个人更喜欢 YAML。我可以使用教义模式工具自动生成实体(这意味着我不必编写 getter/setter)。我还可以使用预编译器/字节码缓存选项,而不必担心我的 cmets 会被删除。


附加信息:

如果您使用的是 PHP 7.0 或更高版本,如果您使用注释,则永远无法在 php.ini 上设置 opcache.save_comments = 0。 PHP 有一种剥离 cmets 的本机方式,这会破坏您的应用程序。 Guilherme Blanco,Doctrine 最活跃的维护者之一,他开发了大多数项目(Doctrine,Symfony)使用的注释检索类has spoken out AGAINST comment annotations(如果你阅读了整个线程,你会发现他对此非常热情) .还有一些extensive discussion on the issues with comment annotations on Reddit,大多数人似乎都同意这是一个坏主意。

尽管如此,Symfony 的官方最佳实践书建议人们使用注释。因此,大多数 Symfony 包可能会使用注释作为它们的元数据格式。

【讨论】:

我永远不能同意 YAML 可读性的论点。就我个人而言,出于可读性的考虑,我更喜欢 XML。 还有一件事:除了 XML 之外,您不能使用任何常量作为值。 我应该注意到,这个答案虽然表达了我对什么应该接受的观点仍然是我的观点,但直接违背了 Symfony 最佳实践手册中的描述。 Sensiolabs 强烈建议人们使用评论注释,并且越来越多的图书馆正在这样做。 @eRIZ Symfony 3.2 现在也允许您使用来自 YAML 的常量值:symfony.com/blog/new-in-symfony-3-2-php-constants-in-yaml-files If you're using PHP 7.0 or higher, you can't ever set opcode.save_comments = 0 on php.ini if you're using annotations. 来源?【参考方案3】:

我认为这是个人喜好问题,我更喜欢注释。

我使用注解是因为如果您想了解某个字段的任何信息,那么您必须打开一个新文件并搜索您需要的规则。

找出这两种情况的最佳方法。然后你看看你喜欢什么。

【讨论】:

以上是关于我应该在 Doctrine 2 中使用 YAML/XML 还是注解映射?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 yaml Doctrine 2 中添加约束索引

从 Doctrine 中的新 YAML 迁移数据库

如何使用 XML 或 YAML 而非注解映射来定义 Doctrine mappedSuperclass

生成的 Doctrine 模型尊重大小写,但生成的 Yaml 不

从 MySQL 数据库为 Doctrine 生成 YAML 模式或模型

如何将自定义属性添加到 Symfony Doctrine YAML 映射文件