我应该选择教义2还是Propel 1.5 / 1.6,为什么?[关闭]


30

我想听听那些使用Doctrine 2(或更高版本)和Propel 1.5(或更高版本)的人的信。这两个对象关系映射器之间的大多数比较都基于旧版本-Doctrine 1与Propel 1.3 / 1.4,并且两个ORM在其最新修订版中都进行了重大的重新设计。例如,大多数对Propel的批评似乎都集中在“ ModelName Peer ”类上,无论如何在1.5中都弃用了该类。

到目前为止,这是我积累的(并且我尝试使此列表尽可能平衡...):

  • 推进
    • 优点
      • 对IDE非常友好,因为它生成了实际的代码,而不是依赖于PHP魔术方法。这意味着诸如代码完成之类的IDE功能实际上很有帮助。
      • 快速(就数据库使用而言-对数据库不进行运行时自省)
      • 架构版本之间的干净迁移(至少在1.6 beta中)
      • 可以生成PHP 5.3模型(即名称空间)
      • 使用方法之类的东西很容易将很多东西链接到一个数据库查询中useXxx。(请参见上面的“代码完成”视频)
    • 缺点
      • 需要一个额外的构建步骤,即构建模型类。
      • 每当更改Propel版本,更改设置或更改架构时,都需要重建生成的代码。这对某些人可能是不直观的,并且丢失了应用于模型的自定义方法。(我认为吗?) -不正确;自定义方法不会丢失,因为生成的类是基类。Propel提供了专门用于扩展的实体类。
      • 一些有用的功能(即版本行为,架构迁移)处于beta状态。
  • 教义
    • 优点
      • 更流行
      • 与Propel的ActiveRecord策略相比,学说查询语言可以表达数据之间潜在的更复杂的关系。
      • 与Propel相比,更易于添加可重用的行为。
      • 用于构建架构的基于DocBlock的注释嵌入在实际的PHP中,而不是单独的XML文件中。
      • 在各处使用PHP 5.3命名空间
    • 缺点
      • 需要学习一种全新的编程语言(Doctrine查询语言)
      • 根据“魔术方法”在多个地方实现,使IDE自动完成功能一文不值。
      • 需要数据库自省,因此默认情况下比Propel慢一些;缓存可以消除这种情况,但是缓存会增加相当大的复杂性。
      • 较少的行为包含在核心代码库中。Propel开箱即用提供的某些功能(例如嵌套集)仅可通过扩展使用。
      • 怪异的巨大:)

我仅通过阅读可用于这两种工具的文档来收集了这些信息-我实际上还没有构建任何东西。

我想听听那些曾经使用这两种工具的人,分享他们在每个库的优缺点方面的经验,以及他们对此的建议:)


您在说什么版本的教义?v2和v1.2相距甚远。
2011年

1
@Orbling:您是否阅读了问题的标题或正文?再次阅读它们:)
Billy ONeal

@Billy ONeal:好点。Doctrine2的行为几乎完全从Core中删除,因此我认为您可能一直在谈论v1.2。
2011年

@Orbling:嗯,这很有意义。另一方面,它提供了与“行为”等效的功能-只是没有这样称呼他们。
Billy ONeal

@Billy ONeal:并非如此,您可以以相当容易的方式自己实现它们,也可以获取第三方插件。但是它不像Doctrine1或Propel。
2011年

Answers:


15

尽管目前流行推荐教义的趋势,但我需要另外说。还要记住,我的个人偏好是根据我的个人经历而定的,但是@Dan这么说,它们都很有力。

我不喜欢学说几个你前面所说的一样大小,整个魔术方法啄是原因这笔交易断路器和我在一起。那么,我使用Propel,为什么呢?主要是因为它很简单,并且因为软件开发简单才是。我个人认为贪婪的设计是不好的。

使用Propel,我设法为自己的系统实现了存储库模式实现,并且确实运行良好,更不用说Propel的性能了,Propel是我见过的最快的ORM之一。

所以,我的基本答案是Propel,因为它用更少的代码就能完成优质的软件,并且使IDE能够为您提供良好的智能感知,而不会失去连接数据库并做得很好的ORM软件的意义。

希望我能帮忙


我使用Doctrine一年了。我尝试过Kohana,Laravel Eloquent,我喜欢他们的公共领域,因为我真的很讨厌getter和setter(我更喜欢属性访问器:P)。在Propel中看到“ IDE友好”一词后,我决定今晚尝试Propel。
Zorji 2015年

11

您有关教义2的信息是错误的...

  • DQL几乎是SQL,因此无需太多学习。
  • 教义2不使用任何“魔术”(仅使用您在任何最新的PHP库中所期望的)。
  • Doctrine 2并未主动进行数据库自省...映射存储在您的实体/映射文件中,并且假定您的数据库将适合于此。
  • 缓存几乎不是“相当大的复杂性”。
  • 教义2没有开箱即用的“行为”

我以前没有使用过Propel,但是Doctrine 2较新,并且具有非常高质量的代码库。但是看起来Propel使用Active Record,Doctrine 2使用Data Mapper模式。

教义2较新的缺点是缺乏第三方示例,但它正在迅速建立。

我推荐教义2 ...


如果您以前没有使用过Propel,那么我将别无选择,只能因为FUD而拒绝投票。至于“ Magic”注释,我的意思是说它基于PHP魔术方法,例如__get__set(这是真的),而不是实际方法。
Billy ONeal

1
好的,投下赞成票...但是教义2在哪里使用魔术方法?除了DocumentRepository的find *方法(__call)之外,这不是问题,因为它只是查询的一种更好的方法……您将永远失去IDE自动完成功能。如果要ActiveRecord,请使用Propel。如果要使用数据映射器,请使用Doctrine2。–
Cobby

2
由于代码生成,Propel不会在运行时内省数据库。
威廉·杜兰德

项目符号1并不完全正确,DQL不像SQL那样“相当”。DQL取决于您引用的是Doctrine必须知道的模型对象的事实,如果需要更复杂的联接,则会带来一些麻烦。
Mike Purcell 2012年

2
DQL是SQL的方言,这怎么不使它像SQL一样“相当”呢?是的,该语言的语义稍有不同(对象与表),但是DQL最终是用于查询结构化数据的语言-恰好只是表示为对象而不是表-aka SQL。
科比2012年

3

从您的评论中看来,您似乎正在尝试选择Propel或Doctrine来替换或满足您在旧版应用程序中对ORM的需求。

话虽如此,我认为重要的是不要忽视这样一个事实,即迁移到任何一个都可能会对您的应用程序带来很大的改进。因此,没有真正错误的答案。

因此,根据您对以下问题的回答,选择的解决方案在很大程度上取决于您的偏好:

  1. 哪一个最适合您当前的解决方案?
  2. 您更喜欢哪个API?
  3. 您想为哪一个贡献力量?(补丁,文档,错误报告等)

就个人而言,我会推荐Doctrine 2,因为它是社区,文档和体系结构。


1
我在这里寻找它们之间的比较。(为什么我更愿意为哪一个提供帮助?我不想为其中任何一个提供帮助-我想使用该库,而不是编写它!;))。您说的是Doctrine 2具有良好的社区,文档和体系结构-在体系结构方面,是的,它是DataMapper。在文档方面,我不确定我是否同意-这两个项目似乎都有不错的文档。我没有看到使用这两种系统的社区太多。您是否愿意详细说明这些东西的含义?
Billy ONeal

2
哦,你喜欢“教义”文档吗?你读过《 Propel》吗?是的,Doctrine社区很好,但是请看一下ODM存储库,甚至很多PR也没有被评论,合并或拒绝……看Propel时间表,该社区真的很活跃;)
William Durand

3

我建议您使用Propel,因为它具有良好的集成,快速和强大的功能。生成代码比在运行时加载类更好,它简化了调试步骤,并向您显示了您创建的内容。因此,构建步骤不是问题。

Doctrine2没有任何官方行为,DataMapper设计模式很酷,但在现实生活中却很难使用。哦,DQL是一种痛苦的语言,但却是一种学习的跨国语言。

如果要考虑对象(没有DQL / SQL /任何东西),请选择Propel。

Doctrine2实际上是Symfony2的一部分,但是事情很快就会发生变化,请参阅Fabien Potencier的最后一篇文章。

干杯,威廉


,我从2年前以Profpel开始时使用了symfony1。然后不得不切换到Doctrine2以获得symfony2。很高兴回到Propel。干杯!
Bhanu Krishnan 2012年

2

他们俩都很好。在某些极端情况下,一个人可以比另一个做某事或做得更好。无论我在哪里遇到问题,这都是由于我缺乏知识而不是他们无法做到的。

这意味着文档和支持比代码的固有能力更重要。您认识遇到问题的人可以帮助您吗?您对文档的满意度如何?其中之一对您来说是否更“自然”?


2

我为大型旧版mysql应用程序(约200张表)选择了Propel 1.63-这里的因素包括:IDE支持,使新开发人员可以轻松地通过代码完成找到自己的方式;跨数据库架构支持,性能;对枚举和多种行为的更好的本地支持。实际上,我从Doctrine开始,因为这是Symfony2最好的支持,但是一旦Propel大大提高了他们对Symfony的支持(我将最终迁移到的下一个平台),由于对上述问题的更好处理,我转而使用。毫无疑问,Propel是决定性的赢家。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.