Api-Platform 上的 Data Persister 之后叫什么?
What is called after a Data Persister on Api-Platform?
我正在使用 Api-Platform 2.5 和 Symfony 4.4 (lts)。
我发现了 API 平台,我知道有很多 "interceptors" 可以拦截 HTTP 请求:
对于 GET
请求:数据提供者、控制器、序列化过程,最后是设置响应代码的 "anonymous process"。
对于 POST
、PUT
、PATCH
和 DELETE
:序列化过程、数据提供者、控制器、数据持久化,最后是 "anonymous process" 这是设置响应代码。
这是我的 Data Persister:
ProductDataPersister:
namespace App\DataPersister;
use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use App\Entity\Product;
final class ProductDataPersister implements ContextAwareDataPersisterInterface
{
public function supports($data, array $context = []): bool
{
return $data instanceof Product;
}
public function persist($data, array $context = [])
{
//dd('persist');
return $data;
}
public function remove($data, array $context = [])
{
//dd('remove');
}
}
在这种情况下,persist 和 remove 都不会生成数据库内容,因为它必须通过注入实体管理器等手动完成。
我的问题是,正如我们所说,此代码的删除操作永远不会删除产品,这就是我想要的但是我对 DELETE
请求的响应仍然没有被覆盖并且仍然 returns 204
状态码 (no content).
我想覆盖响应类型。在 Data Persister 之后执行了哪些其他侦听器?
是否可以覆盖?
如果您查看 Api-平台 event system,很明显您正在寻找的事件,即您称为 "anonymous process" 的事件,是适当命名的RespondListener
.
您可以看到 here 设置响应代码的确切位置。
覆盖它的最简单方法是 register your own event listener/subscriber 在这个侦听器之后执行:
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['fooMethod', EventPriorities::POST_RESPOND],
];
}
在 fooMethod(ViewEvent $event)
上,您可以访问访问响应对象($event->getResponse()
并修改它,甚至可以创建您自己的响应对象(尽管这可能不是最佳选择)。
或者,您可以 decorate @api_platform.listener.view.respond
服务,并在装饰器中实现您的重写逻辑。
我正在使用 Api-Platform 2.5 和 Symfony 4.4 (lts)。
我发现了 API 平台,我知道有很多 "interceptors" 可以拦截 HTTP 请求:
对于 GET
请求:数据提供者、控制器、序列化过程,最后是设置响应代码的 "anonymous process"。
对于 POST
、PUT
、PATCH
和 DELETE
:序列化过程、数据提供者、控制器、数据持久化,最后是 "anonymous process" 这是设置响应代码。
这是我的 Data Persister:
ProductDataPersister:
namespace App\DataPersister;
use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use App\Entity\Product;
final class ProductDataPersister implements ContextAwareDataPersisterInterface
{
public function supports($data, array $context = []): bool
{
return $data instanceof Product;
}
public function persist($data, array $context = [])
{
//dd('persist');
return $data;
}
public function remove($data, array $context = [])
{
//dd('remove');
}
}
在这种情况下,persist 和 remove 都不会生成数据库内容,因为它必须通过注入实体管理器等手动完成。
我的问题是,正如我们所说,此代码的删除操作永远不会删除产品,这就是我想要的但是我对 DELETE
请求的响应仍然没有被覆盖并且仍然 returns 204
状态码 (no content).
我想覆盖响应类型。在 Data Persister 之后执行了哪些其他侦听器?
是否可以覆盖?
如果您查看 Api-平台 event system,很明显您正在寻找的事件,即您称为 "anonymous process" 的事件,是适当命名的RespondListener
.
您可以看到 here 设置响应代码的确切位置。
覆盖它的最简单方法是 register your own event listener/subscriber 在这个侦听器之后执行:
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['fooMethod', EventPriorities::POST_RESPOND],
];
}
在 fooMethod(ViewEvent $event)
上,您可以访问访问响应对象($event->getResponse()
并修改它,甚至可以创建您自己的响应对象(尽管这可能不是最佳选择)。
或者,您可以 decorate @api_platform.listener.view.respond
服务,并在装饰器中实现您的重写逻辑。