使用Doctrine for PHP的优点?

时间:2010-11-07 17:07:27

标签: php web-applications orm architecture database-abstraction

刚遇到Doctrine Project,它有一个Object Relational Mapper和一个DB Abstraction Layer。 Doctrine提供的其他PHP抽象层不是什么?除了通过使用Doctrine查询语言编写的查询获取对象之外,还有什么实际用途可以放置ORM?查询语言真的是您想要开发整个Web应用程序吗?它表现良好吗?

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

3 个答案:

答案 0 :(得分:15)

  

Doctrine提供的其他PHP抽象层不是什么?

  1. 实现DataMapper模式而非ActiveRecord。
  2. 支持annotations,XML和YAML for schema。
  3. 使用DQL
  4. 使用PHP 5.3 +的优点。
  5. 速度快,社区规模大。
  6. 除了ORM,还有ODM。
  7.   

    您的查询语言是否真的需要开发整个Web应用程序?

    负责维护业务对象的应用程序的一部分应该知道Doctrine的存在。而那部分不一定是100%基于学说。

      

    总的来说,在Doctrine上构建应用程序是否更容易维护和理解?

    当然。代码更易于阅读,理解和维护。

      

    是否过度设计,对中小型项目是否合理?

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


    学说不是一切的答案,有时候它有点问题。但是对于典型的任务,它非常有用。恕我直言,此时PHP的最佳ORM / ODM。

答案 1 :(得分:2)

我想对Crozin的回​​答补充几点,但遗憾的是无法发表评论。他们在这里:

  • Doctrine不使用魔术方法__get()和__set()来访问实体属性,所有实体属性都应该具有getter / setter。这改善了IDE代码的完成,您无需一直查看数据库表结构。
  • Doctrine完全从真实的表字段名称中抽象出来。将实体属性映射到数据库字段后 - 您可以在任何地方使用属性名称。表名相同。
  • Doctrine使用存储库模式隐藏了获取实体的详细信息。
  • Doctrine使用“代码优先”方法,因此您可以先创建实体,然后自动为它们生成数据库。反向情况也是可能的。
  • Doctrine具有强大的查询构建器,因此您可以将构建器模式用于具有条件部分的查询。
  • Doctrine使用外键和约束来执行级联操作并保持数据一致。
  • Doctrine的UnitOfWork是一个非常伟大而聪明的东西,在其他php ORM中没有类似的东西
目前,恕我直言,在所有可用的PHP ORM中提供最佳IDE代码完成支持和数据库层抽象。它没有过度设计,遵循SOLID原则。

答案 2 :(得分:0)

我想补充一下GerKirill的回答。没有对魔术吸气剂/二传手法的支持是一个弱点,恕我直言,而不是力量。如果你曾经浏览过几十页相同的getter / setter,你会发现这些方法浪费了大量的空间(更不用说编译时间了)。没有人不小心设置了一个对象变量,而一个setter并没有阻止你这样做...当你想要改变属性时,你只需要调用setter(如何设置者“保护”属性 - 如果你是打个拼写错误并直接设置错误的属性值,你会犯同样的拼写错误并调用错误的setter)。除了获取或设置属性之外,setter或getter除了做任何其他事情之外是非常罕见的。如果你必须做一些特别的事情来设置或获取属性,那么该属性应该是一个方法(参见http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html),或者你应该重构你的代码,或者你应该调用属性验证函数(通常在创建对象的时间)。这是困扰OO世界的那些毫无挑战的老生常谈之一。在发布标准的接收智慧回复之前,请考虑一下。