【问题标题】:Advantages of using Doctrine for PHP?使用 Doctrine for PHP 的优势?
【发布时间】:2011-05-06 08:18:56
【问题描述】:
刚刚遇到Doctrine 项目,它有一个对象关系映射器和一个数据库抽象层。 Doctrine 提供了其他 PHP 抽象层没有提供的什么?除了通过用 Doctrine Query Language 编写的查询来获取对象之外,您还能将 ORM 用于什么实际用途?查询语言真的是您想要开发整个网络应用程序的东西吗?效果好吗?
总体而言,在 Doctrine 上构建应用程序是否更易于维护和理解?它是否过度设计,是否建立在适合中小型项目的抽象层上? (
【问题讨论】:
标签:
php
web-applications
orm
architecture
database-abstraction
【解决方案1】:
Doctrine 提供了哪些其他 PHP 抽象层没有提供的功能?
- 实现 DataMapper 模式而不是 ActiveRecord。
- 支持annotations、XML 和 YAML 架构。
- 使用DQL。
- 利用 PHP 5.3+ 的优势。
- 速度快,拥有庞大的社区。li>
- 除了 ORM,还有 ODM。
您真的想用查询语言来开发整个网络应用程序吗?
只是负责维护业务对象的应用程序的一部分应该知道 Doctrine 的存在。而且这部分不一定要 100% 基于 Doctrine。
总体而言,在 Doctrine 上构建应用程序是否更易于维护和理解?
当然。代码更易于阅读、理解和维护。
是否过度设计,是否适合中小型项目?
实际上,Doctrine 的基本原理非常简单。对于小型、中型甚至一些大型应用程序来说,它都是一个非常不错的选择。
教义并不是万能的,有时它会有点问题。然而,对于典型的任务,它非常有用。恕我直言,目前 PHP 最好的 ORM/ODM。
【解决方案2】:
我想为 Crozin 的回答补充几点,但遗憾的是无法发表评论。他们在这里:
- Doctrine 不使用魔术方法 __get() 和 __set() 来访问实体属性,所有实体属性都应该有 getter/setter。这提高了 IDE 代码完成度,您无需一直查看数据库表结构。
- Doctrine 将您从真实的表字段名称中完全抽象出来。一旦您将实体属性映射到数据库字段 - 您可以在任何地方使用属性名称。表名也一样。
- Doctrine 使用存储库模式,它隐藏了获取实体的详细信息。
- Doctrine 采用“代码优先”的方法,因此您可以先创建实体,然后自动为它们生成数据库。也可以反转大小写。
- Doctrine 具有强大的查询构建器,因此您可以将构建器模式用于带有条件部分的查询。
- Doctrine 使用外键和约束来执行级联操作并保持数据一致。
- Doctrine 的 UnitOfWork 是一个非常棒和聪明的东西,它在其他 php ORM 中没有类似的东西
恕我直言,目前学说在所有可用的 php ORM 中提供了最好的 IDE 代码完成支持和 DB 层抽象。它没有过度设计并遵循 SOLID 原则。
【解决方案3】:
我想为 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 世界的那些无可争议的真理之一。在发布标准的接收智慧回复之前,请考虑一下。