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"。

对于 POSTPUTPATCHDELETE:序列化过程、数据提供者、控制器、数据持久化,最后是 "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 服务,并在装饰器中实现您的重写逻辑。