【问题标题】:Does Symfony have an interface for ORMs?Symfony 是否有用于 ORM 的接口?
【发布时间】:2017-05-21 07:14:48
【问题描述】:

我想知道是否有一个不同的 ORM 应该为 Symfony 实现的接口。

当我构建一个接受 ORM(现在的 Doctrine)的服务并想要声明类型时,这个问题出现了。

我猜不同的 ORM 有不同的行为和类......在这些情况下,如何构建不依赖特定 ORM 的实体以防万一以后想要切换?

【问题讨论】:

  • Symfony 没有任何 ORM 接口。 Doctrine 本身有不同的层,特别是有 Doctrine\Common\Persistence\ObjectManager 和 ObjectRepository 接口。任何实现这两个接口的 ORM 都可以(理论上)被插入而无需太多改变。我不知道有任何其他 ORM 可以做到这一点。老实说,期望像 ORM 这样的东西可以被换掉是非常不现实的。会出现太多细微的差异。

标签: php symfony orm


【解决方案1】:

通常,Symfony 与您选择的 ORM 无关。

standard edition 与 Doctrine 捆绑在一起,还包含一些“桥梁”代码以简化集成。

但是,您可以使用任何您喜欢的 ORM。例如,众所周知,Propel 也可以很好地与 Symfony 配合使用。 Propel 团队还维护着integration bundle

在 ORM 必须遵守的正式描述意义上,没有“接口”。没有interface SymfonyOrmInterface {}这样的东西。

想一想,Symfony 应该如何以及为什么要求这样做? Symfony 是一个建立在一组松散耦合组件之上的 HTTP 框架。这些组件中的大多数甚至不知道什么是 ORM,也不知道应用程序中当前是否可用。

您通常会通过 composer 安装您的 ORM,它会在您的业务代码中可用(假设它支持使用 PSR-0/-4 自动加载)。

当然,为了将 ORM 正确集成到 Symfony 中,有一些约定和特性,例如:

  • CLI 命令,例如对于架构更新,
  • 通过全局 config.yml 和 parameters.yml 文件管理配置值,
  • 通过依赖注入提供服务和依赖。

这些在集成包中实现,通常由各自的 ORM 供应商提供。

对于您的业务代码,这意味着您不能只用另一个 ORM 替换一个 ORM。 ORM 在存储抽象、缓存、查询、水合等方面存在显着差异。替换 ORM 总是需要您在一定程度上调整业务逻辑,而不仅仅是在 Symfony 项目中。

【讨论】:

  • 但是有没有那些ORM应该实现的接口?
  • 不,Symfony 没有声明。你如何想象这个界面?许多 ORM 之上的另一个抽象层? softwareengineering.stackexchange.com/q/170619/257809
  • 您可以使用每个存储的接口和实现,例如 Users(作为接口)和 DoctrineUsers(作为注入 Doctrine 类的教义的实现)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2021-02-23
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多