如何在将数据提交到表单之前更改请求?

How to change Request before submitting data to a Form?

我正在按照 JSON API 规范 (Documentation) 使用 Symfony 3 构建一个 API。

提交新数据时,请求格式为:

{
  "type": "entity",
  "id"  : null,
  "attributes" : {
    "name" : "Test name"
  }
}

但问题是由于额外的对象 attributes.

,请求不符合 symfony 表单预期的格式

所以我希望能够在表单提交之前转换请求,以使表单能够填充底层实体。

我试图注册一个 FormEvents:PRE_SUBMIT 并在其中执行逻辑,但似乎我无法访问请求内容。

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
            $data = $event->getData();

            var_dump($data);
            die();
        });

$event->getData()null

我也看到可以注册 DataTransformer 但它是按字段注册的,也无法访问请求。

我不想在 Controller 中手动执行此操作,因为这会在我的所有表单(或至少大多数表单)上发生,因此我搜索了一种更通用的方法来转换请求,但在这一点上我不知道该怎么做。

感谢您的帮助。

您的 EventListener 无法访问您的 Request,您的 Form 本身也无法访问。

在我看来,最好和最干净的方法是为您的 Forms 定义一个自定义 RequestHandler,扩展解析您的 RequestNativeRequestHandler默认情况下。

然后您只需执行 $builder->setRequestHandler() 即可将其应用于您的表单。