9

刚刚遇到了具有对象关系映射器和数据库抽象层的Doctrine项目。Doctrine 提供了其他 PHP 抽象层没有提供的什么?除了通过用 Doctrine Query Language 编写的查询来获取对象之外,您还能将 ORM 用于什么实际用途?查询语言真的是您想要开发整个网络应用程序的东西吗?它表现良好吗?

总体而言,在 Doctrine 上构建应用程序是否更易于维护和理解?它是否过度设计,是否建立在适合中小型项目的抽象层上?(<50 个 GUI 屏幕),而不是直接使用 MySQL。

4

3 回答 3

15

Doctrine 提供了其他 PHP 抽象层没有提供的什么?

  1. 实现 DataMapper 模式而不是 ActiveRecord。
  2. 支持架构的注解、XML 和 YAML。
  3. 使用DQL
  4. 使用 PHP 5.3+ 的优点。
  5. 速度很快,社区很大。
  6. 除了 ORM,还有 ODM。

查询语言真的是您想要开发整个网络应用程序的东西吗?

只是负责维护业务对象的应用程序的一部分应该知道 Doctrine 的存在。这部分不一定是 100% 基于教义的。

总体而言,在 Doctrine 上构建应用程序是否更易于维护和理解?

确实。代码更易于阅读、理解和维护。

它是否过度设计,是否适合中小型项目?

实际上,教义的基本原理非常简单。对于小型、中型甚至一些大型应用来说,它是一个非常好的选择。


教义不是万能的答案,有时它有点问题。然而,对于典型的任务,它非常有用。恕我直言,目前 PHP 的最佳 ORM/ODM。

于 2010-11-07T17:29:40.183 回答
2

我想为 Crozin 的回答补充几点,但遗憾的是无法发表评论。他们来了:

  • Doctrine 不使用魔术方法 __get() 和 __set() 来访问实体属性,所有实体属性都应该有 getter/setter。这提高了 IDE 代码完成度,您无需一直查看 DB 表结构。
  • Doctrine 将您从真实的表字段名称中完全抽象出来。一旦您将实体属性映射到数据库字段 - 您可以在任何地方使用属性名称。表名也一样。
  • Doctrine 使用存储库模式,它隐藏了获取实体的细节。
  • Doctrine 采用“代码优先”的方法,因此您可以先创建实体,然后自动为它们生成数据库。反过来的情况也是可能的。
  • Doctrine 具有强大的查询构建器,因此您可以利用构建器模式进行带有条件部分的查询。
  • Doctrine 使用外键和约束来执行级联操作并保持数据一致。
  • Doctrine 的 UnitOfWork 是一个非常棒和聪明的东西,它在其他 php ORM 中没有类似物

恕我直言,目前学说在所有可用的 php ORM 中提供了最好的 IDE 代码完成支持和 DB 层抽象。它没有过度设计并遵循 SOLID 原则。

于 2014-08-21T13:48:16.727 回答
0

我想为 GerKirill 的回答补充一点。缺乏对魔术 getter/setter 方法的支持是一个弱点,恕我直言,而不是优势。如果您曾经滚动浏览过几十页相同的 getter/setter,您会意识到这些方法非常浪费空间(更不用说编译时间了)。没有人会意外设置对象变量,而 setter 不会阻止您这样做......当您想要更改属性时,您只需调用 setter(setter 如何“保护”属性 - 如果您是要打错字并直接设置错误的属性值,您将打错字并调用错误的setter)。除了获取或设置属性之外,setter 或 getter 很少做任何事情。如果您必须做一些特殊的事情来设置或获取属性,http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html),或者你应该重构你的代码,或者你应该调用一个属性验证函数(通常在创建对象的时间)。这是困扰 OO 世界的那些无可争议的真理之一。在发布标准的接收智慧回复之前,请考虑一下。

于 2018-02-21T18:17:51.960 回答