访问Symfony2请求对象中的POST值


93

好的,这是一个新手问题,但是我在任何地方都找不到答案。在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是没有返回任何东西。我究竟做错了什么?谢谢!

Answers:


99

Symfony 2.2

此解决方案从2.3开始弃用,并将在3.0中删除,请参阅文档

$form->getData();

给你一个数组的形式参数

摘自symfony2书第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);

请参阅文件


4
这很好,现在是最佳答案。当我问这个问题时,$ form-> getData()不存在或没有记录。
阿西拉(Acyra)2012年

4
要将请求数据绑定到最新版本的表单中,应使用$ form-> handleRequest($ request); 而不是$ form-> submit($ request); 我认为。更多详细信息symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev 2014年

127

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

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

如果您还是有问题,尝试做一个var_dump()$request->request->all()看到所有的提交值。


2
谢谢。var_dump提供了帮助,我最终用全名进行了攻击,以恢复表单数据,例如$ postData = $ request-> request-> get('acme_somebundle_contact_type')
Acyra 2011年

1
请参阅下面的timaschew的答案,因为被问到了,所以Symfony2添加了一个新方法:$ form-> getData();。
阿西拉(Acyra)2012年

2
如果您覆盖了getName(),则不要硬编码名称也很有意义:$request->request->get($form->getName());
meze 2013年

谢谢..节省了我很多时间:)干杯!
Anjana Silva

38

对我有用的是使用这个:

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

这就是《问题》提到的内容,+那里有
@meze的

17

方法有一个窍门ParameterBag::get()。您可以将$deep参数设置为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/…–
AL

8

可以在控制器中使用以下代码访问字段数据:清单12-34

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

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

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

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



1

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

$form->getClientData();


7
不推荐使用getClientData。使用getData,getViewData,getNormData...。Form组件在SF2中确实很凌乱(它们确实应该受到Java世界和酷炫的RequestDataBinder的启发……)
Thomas Decaux

0

Symfony 文档获取请求数据

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

$ content = $ request-> getContent();


-14

如果您是新手,欢迎使用开源项目Symfony2,因此,如果您想学习很多,可以打开源代码!

从“ Form.php”:

getData()getNormData()getViewData()

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


始终使用Symfony方式,$
Thomas Decaux,2012年

是的,我不好解释^^,但这与$form->getData();我确认的人们完全懒惰并且想要一个解决方案而无需思考的解决方案完全相同;-(
Thomas Decaux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.