我应该在Doctrine 2中使用YAML/XML或注释映射吗?

son*_*nam 11 symfony doctrine-orm

我在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表达式?

Iva*_*tar 21

这基本上取决于偏好.

这是我对事物的看法:

注释的优点:

  • 更容易使用,因为它们接近他们描述的(属性)
  • 正如您已经注意到的,许多示例都使用它们

yaml/xml的优点

  • 这使域对象保持干净,所以持久层绝对没有泄漏到域中(即使是以注释的形式)

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

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

关于这个:"我将不得不写很多代码,setter和getter,映射信息":

Doctrine需要私有/受保护的属性,因此您仍然会编写getter和setter.你仍然会在另一个地方写下地图信息.

就个人而言,我会使用注释,因为如果需要,可以更容易地找到示例和信息.

  • 我永远不会*带注释.由于缺少本机注释,注释注释是一种非常难看的解决方法.如果您的应用依赖评论来正常运行,那么您做错了.使用评论注释也会使您的应用程序无法使用HipHop等编译器.注释注释是**唯一具有技术缺陷的**规范.YAML和XML是我唯一的选择.我们应该停止建议人们现在使用评论注释. (22认同)
  • 我知道.但默认情况下,文档中的示例仍然在PHP /注释中.那不是一个问题.我最喜欢的评论是,evereything在同一个地方.此外,在一个巨大的yaml/xml文件中配置所有实体也对我有点不利. (3认同)
  • 到目前为止,仅有很多yaml例子,仅供参考. (2认同)
  • 拿@Pedro用一粒盐说的话.注释是添加元数据的一种干净有效的方法.理想情况下,我们有一天会得到Annotations的原生支持,但这是我们目前最好的止损.这最终都是一个偏好问题,Pinetree在描述优缺点方面做得很好. (2认同)

Ped*_*iro 19

使用Annotations有一个缺点.由于它们是在注释上定义的(这很奇怪),因此您将无法使用预编译器(如Zend Guard)或某些字节码php缓存扩展来增强代码性能(其中一些会删除注释).由于注释是唯一具有此技术缺陷的规范,因此我不建议使用它.

此外,在评论上写"功能"的东西也很奇怪.

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

YAML比其他任何一个都更具可读性,但它也依赖于空间识别(有些人不喜欢).Symfony默认使用YAML进行配置,因此许多使用Symfony的人选择使用YAML作为学说映射 - 这意味着YAML示例已有详细记录,并且有大量资源.

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


附加信息:

如果您使用的是PHP 7.0或更高版本,opcache.save_comments = 0则在使用注释时无法设置php.ini.PHP有一种本地方式来删除注释,这将破坏您的应用程序.Guilherme Blanco是Doctrine最活跃的维护者之一,也是开发大多数项目(Doctrine,Symfony)使用的注释检索类的人,他已经发表了评论注释(如果你读完整个帖子,你会发现他非常热情)对这个).关于Reddit评论注释的问题也有一些广泛的讨论,大多数人似乎都认为这是一个坏主意.

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


Mit*_*oof 7

我认为这是一个自己喜欢的问题,我更喜欢注释.

我使用注释,因为如果你想知道一个字段在字段上方的任何信息,否则你必须打开一个新文件并搜索你需要的规则.

最好的方法来解决它创建两个案例.然后你看看你喜欢什么.