这与我的另一个问题有关:使用REST API保持实体.
对于Symfony2中的项目,我需要能够使用远程(第三方)RESTful API来持久化实体.我还希望能够使用该API中的数据检索实体.
换句话说,我的对象保存在第三方数据库中.它们不会保存在我自己的数据库中.每当我需要保存数据或查找数据时,我都会使用他们的REST API.
我被指向了几个库,包括一个由Doctrine本身制作的库.但是,它们都没有为我提供我正在寻找的东西.由Doctrine制作的那个是最好的选择,但是使用Active Record模式并没有提供所有甜蜜的Doctrine 2.不要误会我的意思,我一直在使用Active Record实现,但我现在已经爱上了Doctrine的Data Mapper模式.
理想情况下,我希望能够使用Doctrine的ORM,只需用使用API调用保存实体的逻辑替换特定于数据库的部分.(当然,使用相同的API检索它们).这样我可以使用大致相同的语法保存我的实体:
// current way to save $entity in database: $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); // desired way to save $entity using REST API: // (just an example, it doesn't have to be exactly like this) $em = $this->getDoctrine()->getManager('rest'); $em->persist($entity); $em->flush();
请注意,我不是要尝试构建自己的API,而只是尝试与第三方API进行通信以保存我的实体.我对Doctrine很新,但到目前为止我还是喜欢它.我真的很喜欢从实体中分离持久性逻辑的想法,但到目前为止我无法找到如何使用API来保存它们.
Symfony的文档中有一篇文章,描述了如何与多个实体经理合作.我正在寻找类似于此的解决方案,但是使用实体管理器可以使用REST而不是数据库.
我一直试图自己调整Doctrine的ORM,但我最终只重写了一半代码,因为它(似乎)与数据库特定的逻辑紧密耦合.当然,我可能会做一些愚蠢的事情.
所以我的问题是,有没有办法用自定义的方式替换/覆盖Doctrine ORM的数据库特定部分?没有重写很多应该对所有持久化方法都很常见的事情?以前做过吗?或者它是不可能的,因为Doctrine旨在与数据库一起使用,并且不够灵活,不能用于其他用途?
CakePHP似乎可以通过让您定义自定义DataSource来实现此目的.这样你可以使用SQL数据库保存模型,但也可以使用API,会话等.我想大致相同,但使用Doctrine代替CakePHP.
实际的数据库查询似乎是由Doctrine\ORM\Persisters\BasicEntityPersister
类执行的
.还有其他几个xxxPersister类,用于处理不同类型的继承.有可能用我们自己的类替换xxxPersister类,因此我们可以用REST API代码替换DB代码.
persister对象是在类的getEntityPersister()
方法中创建的Doctrine\ORM\UnitOfWork
.类名是硬编码的,所以Doctrine\ORM\UnitOfWork
如果我们想要使用自己的persisters ,我们需要覆盖.
Doctrine\ORM\UnitOfWork
似乎是硬编码Doctrine\ORM\EntityManager
,所以我们也需要覆盖那个.但是,此类似乎包含一些特定于数据库的部分.例如,它的构造函数需要一个Doctrine\DBAL\Connection
对象作为参数.也许最好创建我们自己的EntityManger(实现Doctrine\Common\Persistence\ObjectManager
接口),只要这不需要花费太多时间/精力.
用于检索/加载/查找对象的特定于数据库的代码与用于持久化/删除等的代码位于同一类中:Doctrine\ORM\Persisters\xxxPersister
类.因此,如果我们能够用自己的替换它们,为了持久化对象,我们也可以检索对象.$entityRepository->findAll()
例如,当你调用时,它将返回$entityRepository->findBy(array())
(因为findAll()
它只是一个别名findBy(array())
),它将运行以下代码:
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName); return $persister->loadAll($criteria, $orderBy, $limit, $offset);
换句话说,一旦我们EntityManager
创建了权限UnitOfWork
和xxxPersister
对象,我们就可以使用中的find
方法了EntityRepository
.
我发现了一个新功能是为开发原则:自定义的,持久(另见本).这应该可以更容易地使用自定义持久性类.我还不知道它是否能让我们创建一个非DB持久性,但看起来很有希望.但是,最后的更新是在八月,所以我不确定它是否还在积极开发中.