【问题标题】:ZF2: TableGateway vs Doctrine2ZF2:TableGateway 与 Doctrine2
【发布时间】:2016-06-27 21:19:48
【问题描述】:

你能列出与 Doctrine 相对的原生 ORM 的优缺点吗?

ZF1 为我提供了非常先进的原生 ORM(Zend_Db_TableZend_Db_Table_Row),Zend\Db\TableGateway\TableGatewayZend\Db\RowGateway\RowGateway 是这个的继续。为什么大多数人尝试使用 Doctrine2,尽管它体积庞大,这是主要原因?

附:对我来说,即使是“存储库”这个词也不与数据库相关联..

【问题讨论】:

  • 您无法真正进行比较,因为 ZF1 和 ZF2 都使用您熟悉的适配器和行表网关模式来实现数据库抽象。他们确实但是提供了一个对象关系映射器(ORM),比如 Doctrine 2。
  • 但最后一个示例,在此处描述 framework.zend.com/manual/current/en/modules/… - 获取活动记录集。我们可以手动将 Set 类放入 TableGateway 中,我们可以操作 ActiveRecord 类。我们可以选择适配器来选择设置。为什么这不是 ORM?
  • 如果你想使用Entities,更好的选择是Doctrine。否则,您需要创建/编写一些东西来处理 Entity 依赖项。当然还有很多 TableGateway 代码。

标签: zend-framework doctrine-orm zend-framework2 doctrine-odm


【解决方案1】:

让我们从几个定义开始。

数据库抽象层 (DBAL):位于数据库连接之上的层(驱动程序 + 平台)并提供直观且灵活的 API 用于通信 与最流行的关系数据库。

对象-关系映射 (ORM):一种让您查询和 使用面向对象的范式操作数据库中的数据。 此范例必须包含 Unit of Work 以跟踪 Entities(数据对象)的状态,以便了解哪些操作 (如水合和数据库事务)将必须执行以维护和确保 数据在其整个生命周期内的准确性和一致性。此外,范式必须考虑对象关系以保持数据完整性。这些元素是任何 ORM 实现的基本方面。

因此,Zend\Db 不提供 ORM 功能,因为它只是一个抽象层。您可以尝试使用 hydrators 和 Zend\Db\ResultSet\HydratingResultSet 构建一个,然后创建自己的工作单元。我已经看到由 Ralph Schindler 创建的代码正在走这条路(顺便说一句,代码非常令人印象深刻!)但本身仍然不是 ORM。所以,如果你决定走同样的路,你的工作就会为你完成……使用 Doctrine 的 ORM 肯定会简单得多!

最后,Zend\Db\TableGateway\TableGatewayZend\Db\RowGateway\RowGateway 是使用已知的软件模式(分别为 TableGateway 模式和 Active Record 模式 - 不要与 Design Patterns 混淆)设计的。但这与企业应用程序架构模式(EAA)本身(如工作单元模式)无关。有关 EAA 模式的更多信息,请阅读 Martin Fowler 的书企业应用程序架构模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多