【问题标题】:How to change Request before submitting data to a Form?如何在将数据提交到表单之前更改请求?
【发布时间】:2016-02-11 00:16:59
【问题描述】:

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

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

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

但问题是请求不符合 symfony 表单所期望的格式,因为有额外的对象 attributes

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

我已尝试注册 FormEvents:PRE_SUBMIT 并执行其中的逻辑,但似乎我无法访问请求内容。

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

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

$event->getData()null

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

我不想在控制器中手动执行此操作,因为这将发生在我的所有表单(或至少大多数表单)上,因此我寻找一种更通用的方法来转换请求,但此时我可以不知道怎么做。

感谢您的帮助。

【问题讨论】:

    标签: request symfony json-api


    【解决方案1】:

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

    在我看来,最好和最简洁的方法是为您的Forms 定义一个自定义RequestHandler,扩展默认解析您的RequestNativeRequestHandler

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

    【讨论】:

    • 这正是我想要的。我已经阅读了整个 Symfony 2 文档和 CookBook,但我不记得它解释了你可以做到这一点。它是 Symfony 3 的新功能还是只是没有记录?
    • 显然没有记录,这似乎从 Symfony 2.3 开始就存在
    • 缺点是我需要复制一些内部逻辑(例如$_FILES 和方法验证),因为所有方法都是private。只是有点缺点,因为它比我认为的所有解决方案都干净。
    • 是的,我不知道是否有比复制粘贴私有方法更好的实现这一点的特定最佳实践。我想至少您可以很好地控制您的请求的管理方式:) 祝你好运!
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多