【问题标题】:Persisting entities using a REST API使用 REST API 持久化实体
【发布时间】:2023-03-09 07:02:01
【问题描述】:

对于 Symfony2 中的项目,我需要能够使用外部 RESTful API 而不是数据库来持久化/检索实体。由于 Doctrine 将实体映射到数据库表的一行,我认为创建从实体到外部 API 的映射也应该很容易。但是,这对我来说是新的,我似乎找不到任何关于此的描述/教程。 (也许我错过了我的 Google-fu 的正确词)

我希望有一个类似于 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 已经提到了几个解决方案,但它们并不能完全满足我的要求,我希望会有更多的解决方案,因为我确定我不是第一个必须解决的问题这个问题。

谁能指出我正确的方向?

【问题讨论】:

    标签: php api rest orm persistence


    【解决方案1】:

    Well Circle 为 Doctrine 构建了一个完整的 REST 驱动程序,这意味着您可以使用完全相同的语法,因为它是 Doctrine 充当 REST 客户端:

    https://github.com/CircleOfNice/DoctrineRestDriver

    【讨论】:

      【解决方案2】:

      大约一年前,我试图在没有运气的情况下找到相同问题的答案并创建自己的捆绑包。不幸的是,我不能分享它,因为它是专有的,并不打算开源(少量设置,专门为我们的企业 API 制作等)。但是我可以给你一些链接

      1. 一开始有一个 jms serializer 用于反序列化 + buzz 用于 http 查询。你可以用一些服务和工作来包装它。

      2. Doctrine 有一些丢失的解决方案,称为drest(doctrine rest)。

      3. 我还发现了一些有趣的解决方案,也称为drest。我不尝试使用它,因为它相对较新。 Documentation 看起来不错。

      【讨论】:

      • 谢谢。两种 drest 解决方案似乎都朝着正确的方向发展。但是,我想保持持久性与实体分离,就像使用 Doctrine 本身一样。 Doctrine 的 drest 使用 Active Record 模式,所以它的耦合太紧了。第二个drest似乎是一个更好的选择,但我希望有其他配置选项而不是注解。
      • @Nic 这应该被接受为答案。您在 Q 中提到的所有内容都可以使用 jms 序列化程序来实现。您可以将自定义包装到服务中,使其像实体管理器一样可访问。
      • 谢谢,但我不知道怎么做。我可以以某种方式扩展 Doctrine2,以保持相同的语法,但同时简单地将数据库逻辑替换为 REST 逻辑?
      • 没关系。我创建了一个关于扩展 Doctrine 的单独问题:Save entities to a REST API instead of DB using Doctrine 2。如果在赏金期结束之前没有发布其他答案,我会将其奖励给遗忘者。
      • @Nic 我认为将教义 EM 与其他相关的东西结合起来并不是一个好主意。一件事是保存和加载实体——这很容易,但是 DQL 和关系呢?此外,不同的 API 具有不同的接口和功能,您的实现可能非常特定于 API
      【解决方案3】:

      您正在寻找我认为的rest apis的原则dbal驱动程序

      【讨论】:

        【解决方案4】:

        我在搜索相同功能时发现了这个问题。然而,又过了一段时间,现在似乎有了a solution implementing this

        来自文档:

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

        【讨论】:

        • 你提到它很有趣;)这是我在这个 SO 问题没有导致正确解决方案之后自己创建的库。不幸的是,它的功能还不完整,因为我没有太多时间来研究它。
        • 哈哈,确实! :) 在这里也绕圈子...您的库看起来与我正在寻找的完全一样 - 让 EntityManager 控制填充模型似乎在架构上是合理的。这肯定比将数据源的控制权和持久性交给控制器更好——这是我在其他网站上大量发现的。然而,我很困惑为什么这没有找到更多的牵引力......我想知道为什么没有更多的人想要这样做。也许这是一个非常具体的用例?我不知道。
        • 我想在大多数情况下,使用由 API 所有者维护的客户端库更有意义。然而,RAPL 应该可以轻松连接不附带 PHP 客户端库的 API,尽管与 Doctrine ORM 相比它需要更多的设置工作(因为 API 不像 SQL 数据库那样标准化)。
        • 我同意 - 加上大多数其他人会在他们的前端使用 REST API,例如通过 AngularJS。只会是那些使用 RAPL 方法拥有内部 REST API 的人——这通常用于多层架构并且相当企业化。
        • @Nic:我已经在你的 GitHub 项目上发布了一些关于问题注册的问题。如果您能帮助我入门,我将不胜感激。谢谢,堆。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多