使用REST API持久化实体

6
对于Symfony2项目,我需要能够使用外部RESTful API持久化/检索实体,而不是数据库。由于Doctrine将实体映射到数据库表的行,因此我认为应该很容易创建从实体到外部API的映射。然而,这对我来说是新的,我似乎找不到任何关于此的描述/教程(也许我没有用正确的词进行谷歌搜索)。
我希望有一个类似Doctrine的解决方案。我不想使用基于ActiveRecord模式的东西,因为我希望将持久性逻辑与实体分开。实体不应该知道它是如何被持久化的。
我希望能够做类似于这样的事情:
$entity = new Entity();

$em = $this->getREST()->getManager(); // get REST Entity Manager
$em->persist($entity); // save the entity using a POST request
$em->flush();

和这个:

$em = $this->getREST()->getManager(); // get REST Entity Manager

// retrieve the entity using a GET request
$entity = $em->getRepository('AcmeDemoBundle:Entity')->find($id);

和这个:

$em = $this->getREST()->getManager(); // get REST Entity Manager

// retrieve all entities using a GET request
$entities = $em->getRepository('AcmeDemoBundle:Entity')->findAll();

换句话说,如果语法与Doctrine几乎相同将是很好的。
此外,我想在外部文件(例如YAML)中配置映射,而不是通过实体中的注释进行配置。 (正如我所说,实体不应该知道它们是如何持久化的) Forgottenbas 已经提出了一些解决方案,但它们并不能完全满足我的要求,我希望还有更多的解决方案,因为我相信我不是第一个遇到这个问题的人。
有人能指点我正确的方向吗?
4个回答

4

2
大约一年前,我试图寻找答案,但没有成功并创建了自己的bundle。不幸的是,我不能分享它,因为它是专有的,不打算开源(设置很少,专门为我们的企业API制作等)。但我可以给你一些链接。
  1. 首先,有一个jms serializer用于反序列化+ buzz用于HTTP查询。您可以将其包装在某个服务中,然后完成工作。

  2. Doctrine有一些失落的解决方案称为drest(Doctrine Rest)。

  3. 我还发现了一个有趣的解决方案,也称为drest。我没有尝试使用它,因为它相对较新。文档看起来非常好。


谢谢。两种drest解决方案似乎都朝着正确的方向发展。然而,我想保持持久性与实体分离,就像使用Doctrine本身一样。Doctrine的drest使用Active Record模式,因此耦合度太高。第二个drest似乎是更好的选择,但我希望有其他配置选项而不是注释。 - Nic Wortel
@Nic 这应该被视为答案接受。你在问题中提到的一切都可以通过jms序列化器实现。你可以将自定义包装成服务,以便像实体管理器一样访问它。 - DarkLeafyGreen
谢谢,但我不确定如何做。我能否以某种方式扩展Doctrine2,以保持相同的语法,但同时仅用REST逻辑替换DB逻辑? - Nic Wortel
没关系。我已经创建了一个关于扩展Doctrine的单独问题:使用Doctrine 2将实体保存到REST API而不是数据库。如果在赏金期结束之前没有其他答案发布,我将授予它给forgottenbas。 - Nic Wortel
@Nic 我认为将Doctrine EM与REST相关的内容结合在一起不是一个好主意。一个问题是保存和加载实体 - 这很容易,但是DQL、关系怎么办?此外,不同的API具有不同的接口和功能,你的实现可能非常特定于某个API。 - Alexey B.
@forgottenbas 我认为这是可能的...我们显然不能使用DQL,但是我们可以使用自定义的EntityRepository来提供基本的 find(), findAll()等方法。我正在尽量保持它的通用性和可重复使用性。但如果我遗漏了什么,请一定要让我知道!(最好在Doctrine特定问题的 - Nic Wortel

1
你正在寻找一个Doctrine DBAL的REST API驱动程序,我认为。

0

我在寻找同样功能的过程中发现了这个问题。然而,一些时间又过去了,现在似乎有了实现此功能的解决方案

从文档中可以看到:

RAPL(RESTful API持久化层)是Doctrine ORM的RESTful变体。 它实现了相同的接口,但允许您从远程(RESTful)API而不是数据库存储和检索实体。


很有趣,你提到了它 ;) 这是我在 Stack Overflow 上没有得到合适解决方案后自己创建的库。不幸的是,由于我没有太多时间来工作,它还没有完全实现所有功能。 - Nic Wortel
哈哈,确实! :) 我也在这里打转...你的库看起来正是我所需要的 - 让 EntityManager 控制填充模型在架构上似乎很合理。这肯定比将数据源和持久性控制权交给控制器要好 - 这是我在其他网站上发现的一些问题。然而,我对为什么这不会得到更多关注感到困惑...我想知道为什么没有更多的人想这样做。也许这是一个非常特定的用例?我不知道。 - phpPhil
我想在大多数情况下,使用由API所有者维护的客户端库更有意义。然而,即使没有PHP客户端库,RAPL也应该可以轻松连接到API,尽管与Doctrine ORM相比需要更多的设置工作(因为API不像SQL数据库那样标准化)。 - Nic Wortel
我同意 - 大多数人会在前端通过AngularJS消费REST API。只有那些使用RAPL方法的内部REST API的人才会这样做,这通常是用于多层架构和相当企业化的情况。 - phpPhil
@Nic:我在你的GitHub项目的问题注册表上发布了一些问题。如果您能看一下并帮助我入门,我将不胜感激。非常感谢。 - phpPhil
如何安装和配置RAPL?有人有示例吗? - Lebnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接