访问 Symfony2 请求对象中的 POST 值

Posted

技术标签:

【中文标题】访问 Symfony2 请求对象中的 POST 值【英文标题】:Access POST values in Symfony2 request object 【发布时间】:2011-10-18 11:34:20 【问题描述】:

好的,这是一个新手问题,但我无法在任何地方找到答案。在 Symfony2 的控制器中,我想从我的一个表单中访问 POST 值。在控制器中我有:

public function indexAction()
 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') 
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) 
            $name_value = $request->request->get('name');

很遗憾,$name_value 没有返回任何内容。我究竟做错了什么?谢谢!

【问题讨论】:

【参考方案1】:

Symfony doc 获取请求数据

最后,可以使用 getContent() 访问随请求正文发送的原始数据:

$content = $request->getContent();

【讨论】:

【参考方案2】:

我通过以下方式访问我的多部分发布请求的 ticketNumber 参数。

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

【讨论】:

【参考方案3】:

Symfony 2.2

此解决方案自 2.3 起已弃用,将在 3.0 中删除,see documentation

$form->getData();

为您提供表单参数的数组

来自symfony2 book第162页(第12章:表格)

[...] 有时,您可能只想使用没有类的表单,然后返回提交的数组 数据。这其实很简单:

public function contactAction(Request $request) 
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') 
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  
  // ... render the form

您还可以直接通过请求对象访问 POST 值(在本例中为“名称”),如下所示:

$this->get('request')->request->get('name');

但是,请注意,在大多数情况下,使用 getData() 方法是更好的选择,因为它 返回表单框架转换后的数据(通常是对象)。

当你想访问表单令牌时,你必须使用有问题的答案 $postData = $request->request->get('contact'); 因为getData() 从数组中删除了元素


Symfony 2.3

从 2.3 开始,您应该使用 handleRequest 而不是 bindRequest

 $form->handleRequest($request);

see documentation

【讨论】:

这很好,现在是最好的答案。当我问这个问题时,$form->getData() 不存在或没有记录。 要将请求数据绑定到最新版本的表单,您应该使用 $form->handleRequest($request);而不是 $form->submit($request);我想。更多详情symfony.com/doc/2.3/book/forms.html#handling-form-submissions【参考方案4】:

可以在控制器中访问字段数据: 清单 12-34

$form->get('dueDate')->getData();

另外,也可以直接修改未映射字段的数据: 清单 12-35

$form->get('dueDate')->setData(new \DateTime());

第 164 页 symfony2 书(2013 年 10 月 9 日生成)

【讨论】:

【参考方案5】:

ParameterBag::get() 方法有一个技巧。您可以将$deep parameter 设置为true 并在没有额外变量的情况下访问所需的深层嵌套值:

$request->request->get('form[some][deep][data]', null, true);

你也可以设置一个默认值(get()方法的第二个参数),它可以避免多余的isset($form['some']['deep']['data'])调用。

【讨论】:

第三个参数已被弃用并从 3.0 中删除 注意:从 2.8 版开始不建议使用查找深层项目,将在 3.0 中删除。:github.com/symfony/symfony/blob/…【参考方案6】:

如果你是新手,欢迎来到开源项目 Symfony2,如果你想学习很多,可以开源!

来自“Form.php”:

getData() 获取标准数据() 获取视图数据()

您可以在此文件中找到更多详细信息。

【讨论】:

始终使用 Symfony 方式,$_POST,$request 很脏 是的,我不擅长解释^^,但这与$form->getData();确认的解决方案完全相同,我知道人们很懒,想要一个解决方案而不加考虑;-(【参考方案7】:

我认为为了获取请求数据,由表单对象绑定和验证,你必须使用:

$form->getClientData();

【讨论】:

getClientData 已弃用。使用 getData、getViewData、getNormData .... SF2 中的 Form 组件真的很乱(他们真的应该从 Java 世界和酷的 RequestDataBinder 中获得灵感 ....)【参考方案8】:

对我有用的是使用这个:

$data = $request->request->all();
$name = $data['form']['name'];

【讨论】:

这就是 Problematic 提到的,+ 参见 @meze 的评论【参考方案9】:

表单发布值存储在请求中表单的名称下。例如,如果您重写了 ContactType() 的 getName() 方法以返回“联系人”,您可以这样做:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

如果您仍然遇到问题,请尝试在$request->request->all() 上发送var_dump() 以查看所有帖子值。

【讨论】:

谢谢。 var_dump 有帮助,我最终用全名攻击它以恢复表单数据,例如$postData = $request->request->get('acme_somebundle_contact_type') 见下面 timaschew 的回答,既然有人问了这个问题,Symfony2 添加了一个新方法:$form->getData(); 如果你覆盖了getName(),那么不要硬编码名称是有意义的:$request->request->get($form->getName()); 谢谢.. 节省了我很多时间 :) 干杯!!

以上是关于访问 Symfony2 请求对象中的 POST 值的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony 2.3 控制器中访问 POST 请求的 JSON 正文

如何访问 Symfony2 中的嵌套参数值?

symfony2 获取路由参数(控制器参数与请求)

访问 Symfony2 控制器中未映射的字段

POST 请求后在 swift 模型中访问值的问题

symfony2 选民或 acl