【问题标题】:Access POST values in Symfony2 request object访问 Symfony2 请求对象中的 POST 值
【发布时间】: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 没有返回任何内容。我究竟做错了什么?谢谢!

【问题讨论】:

    标签: php symfony http-post


    【解决方案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'])调用。

          【讨论】:

          【解决方案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());
          • 谢谢.. 节省了我很多时间 :) 干杯!!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多