访问 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 值的主要内容,如果未能解决你的问题,请参考以下文章