gpt4 book ai didi

symfony - API平台: using PUT for creating resources

转载 作者:行者123 更新时间:2023-12-02 02:57:33 25 4
gpt4 key购买 nike

我想使用 PUT 方法来创建资源。它们由 UUID 标识,并且由于可以在客户端创建 UUID,因此我想启用以下行为:

  • 在 PUT/api/myresource/4dc6efae-1edd-4f46-b2fe-f00c968fd881 上,如果此资源存在,请更新它
  • 在 PUT/api/myresource/4dc6efae-1edd-4f46-b2fe-f00c968fd881 上,如果此资源不存在,请创建它

可以通过实现 ItemDataProviderInterface/RestrictedDataProviderInterface 来实现此目的。

但是,我的资源实际上是子资源,所以假设我想创建一本引用现有作者的新Book

我的构造函数如下所示:

/**
* Book constructor
*/
public function __construct(Author $author, string $uuid) {
$this->author = $author;
$this->id = $uuid;
}

但我不知道如何从我的 BookItemProvider 访问 Author 实体(在请求正文中提供)。

有什么想法吗?

最佳答案

在 API 平台中,项目创建时应该发生的许多事情都基于请求的类型。改变起来会很复杂。

这里有两种可能性来制作您想要的东西。

首先,您可以考虑进行自定义路由并使用您自己的逻辑。如果您这样做,您可能会很高兴知道在自定义路由上使用选项 _api_resource_class 将启用 APIPlaform 的一些监听器并避免您进行一些工作。

第二个解决方案(例如,如果您需要全局行为)是覆盖 API Platform。您的主要问题是 ApiPlatform 的 ReadListener 如果找不到您的资源,它将抛出异常。此代码可能不起作用,但以下是如何覆盖此行为的想法:

class CustomReadListener
{
private $decoratedListener;

public function __construct($decoratedListener)
{
$this->decoratedListener = $decoratedListener;
}

public function onKernelRequest(GetResponseEvent $event)
{
try {
$this->decoratedListener->onKernelRequest($event);
} catch (NotFoundHttpException $e) {
// Don't forget to throw the exception if the http method isn't PUT
// else you're gonna break the 404 errors
$request = $event->getRequest();

if (Request::METHOD_PUT !== $request->getMethod()) {
throw $e;
}

// 2 solutions here:

// 1st is doing nothing except add the id inside request data
// so the deserializer listener will be able to build your object


// 2nd is to build the object, here is a possible implementation

// The resource class is stored in this property
$resourceClass = $request->attributes->get('_api_resource_class');

// You may want to use a factory? Do your magic.
$request->attributes->set('data', new $resourceClass());
}
}
}

并且您需要指定一个配置来将您的类声明为服务装饰器:

services:
CustomReadListener:
decorate: api_platform.listener.request.read
arguments:
- "@CustomReadListener.inner"

希望有帮助。 :)

更多信息:

关于symfony - API平台: using PUT for creating resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49767594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com