在Symfony中的REST api中创建链接的实体

时间:2014-07-14 21:05:35

标签: rest symfony hyperlink entity fosrestbundle

创建与其他实体相关联的实体的正确方法是什么?我无法找到任何有关如何使用FOSRestBundle包在Symfony中完成或如何完成的来源。

背景

让我们拥有实体Car,其中包含Wheel实体。

如何在一个请求中创建带轮子的汽车?
url: foo.com/cars POST
数据: {car:{name="porsche", wheels:[{name:"fr"}, {name:"fl"}] }}
这是怎么做的正确方法?我读了一些关于LINK和UNLINK http方法的内容,但是需要发送多个请求才能创建所有轮子,然后将它们链接在一起。

如何创建属于多辆车的车轮?
url: foo.com/wheels POST
数据: {wheel:{name="super wheel", cars:[{id:1}, {id:2}] }}
在这种情况下,可能使用LINK标头是合适的。但在阅读this文章之后,它还需要解析所有POSTS和PUTS的LINK标题,使其变得昂贵且笨重。

修改

我写信给提到的文章的作者。这是他的答案:

  

我认为您可以在一个请求中发送包含您的车轮和汽车的数据。这里最重要的是要务实。没有"明确"构建REST API的规则。

     

当资源已经存在时,LINK / UNLINK非常有用,并且您希望"链接"它们,在>换句话说,你想要添加一个"关系"例如,他们之间,例如用户的友谊。

     

关于你的第二个问题,如果汽车存在,你可以,首先,创建你的车轮,"链接" >它到你的车。但这意味着有两个请求执行此操作(您可以在一个请求中添加多个链接标头),或者更好的是您可以发送一个带有链接标头的POST请求:一个请求统治它们:p

     

另一种选择是参考汽车' ids到你的车轮数据。我认为这样做也很好。

2 个答案:

答案 0 :(得分:1)

我们最近也进行了同样的讨论。

为了清晰和清洁的架构,有一些东西要说,你可以从关系中分离我们的资源等等。还有一些事情可以说是没有提出1000个请求以及将属于一起的东西放在一起。

我们的最终解决方案非常像您的解决方案。另一个解决方案是在插入资源时永远不要包含资源关系,并且有一个单独的API端点来创建关系(例如POST / cars / 1 / wheels / fl)

您走哪条路主要取决于您的域逻辑和应用要求。一旦你有了循环的m:n关系,你(和我们)选择的方法就会遇到大麻烦。对于更简单和层次化的关系,这是一种非常好的方式。

答案 1 :(得分:0)

正如您所说:“构建REST API没有”明确的“规则”。

我通常使用表单来验证我的API中的数据,因此,我已经拥有了我的参数。我使用它是因为,我只需要编写一个端点(以API方式使用,也可以渲染html前端)。表单可能需要ID或子对象(或两者)。

我不是说你应该使用我的观点。但我要说的是:您的API,您的规则(由客户自行调整,但您必须将客户视为构建API)。