【问题标题】:How to get form values in Symfony2 controller如何在 Symfony2 控制器中获取表单值
【发布时间】:2012-02-17 17:37:20
【问题描述】:

我在 Symfony2 上使用带有以下控制器代码的登录表单

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

但我收到以下警告:

警告:array_replace_recursive() [function.array-replace-recursive]:参数 #1 不是 \vendor\symfony\src\Symfony\Component\Form\Form.php 第 593 行中的数组 500 内部服务器错误 - ErrorException

有人可以帮助我了解什么是不正确的,以及如何解决它?谢谢。

更新: 树枝文件是这样的:

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

这是表单类型中的函数

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

路线如下:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    如果 Symfony 4 或 5,只需使用此代码(其中 name 是您的字段名称):

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

    【讨论】:

      【解决方案2】:

      要获取特定字段的数据,

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

      或者对于所有的表单数据

      $form->getData();
      

      文档链接:https://symfony.com/doc/2.7/forms.html

      【讨论】:

        【解决方案3】:

        对于未映射的表单字段,我使用 $form->get('inputName')->getViewData();

        【讨论】:

          【解决方案4】:

          在 Symfony forms 中,有两种不同类型的transformers 和三种不同类型的基础数据: 在任何形式下,三种不同类型的数据是:

          • 模型数据

            这是您的应用程序中使用的格式的数据(例如,问题对象)。如果您调用Form::getData()Form::setData(),您正在处理“模型”数据。

          • 标准数据

            这是您的数据的规范化版本,通常与您的“模型”数据相同(尽管在我们的示例中不是)。不常用直接使用。

          • 查看数据

            这是用于填写表单字段本身的格式。这也是用户提交数据的格式。当您调用Form::submit($data) 时,$data 是“视图”数据格式。

          两种不同类型的转换器有助于在这些类型的数据之间进行转换:

          • 模型转换器

            transform(): "模型数据" => "规范数据"
            reverseTransform(): "规范数据" => "模型数据"

          • 查看转换器

            transform(): "规范数据" => "查看数据"
            reverseTransform(): "查看数据" => "规范数据"

          您需要哪种变压器取决于您的情况。

          要使用视图转换器,请致电addViewTransformer()


          如果要获取所有表单数据:

          $form->getData();
          

          如果您关注特定的表单字段(例如first_name):

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

          【讨论】:

            【解决方案5】:

            如果您的表单中有未在 Entity 中定义的额外字段,$form-&gt;getData() 不起作用,一种方法可能是:

            $request->get("form")["foo"] 
            

            或者:

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

            【讨论】:

            • 谢谢!你拯救了我的一天!
            • 谢谢!这帮助很大。
            • 如果你需要查询的id,如果它是一个对象,你可以执行以下命令:$form->get('foo')->getData()->getId();
            • 非常感谢您的回答,真的很有帮助。
            【解决方案6】:

            在 Symfony >= 2.3 中,您可以通过以下方式获取单个字段的值:

            $var = $form->get('yourformfieldname')->getData();
            

            另一方面,您可以使用:

            $data = $form->getData();
            

            但是这会给你带来两个不同的东西:

            • 如果您的表单启用了data-class 选项(因此它已绑定到实体),则该实体的值由表单填充;这将排除任何带有'mapping' =&gt; false 选项的字段

            • 否则,一个包含所有表单字段的数组

            【讨论】:

              【解决方案7】:
              private function getFormDataArray($form)
              {
                  $data = [];
                  foreach ( $form as $key => $value) {
                      $data[$key] = $value->getData();
                  }
                  return $data;
              }
              

              【讨论】:

              • 如果你的表单有子表单,这段代码应该是这样的:$data[$key] = is_object($value-&gt;getData()) ? $this-&gt;getFormDataArray($value) : $value-&gt;getData();
              【解决方案8】:

              在 Symfony 2(更具体地说,2.3 版本)中,您可以通过

              $var = $form->get('yourformfieldname')->getData();
              

              或者您可以发送所有数据

              $data = $form->getData();
              

              其中 '$data' 是一个包含表单字段值的数组。

              【讨论】:

                【解决方案9】:

                简单地说:

                $data = $form->getData();
                

                【讨论】:

                • 不错的答案 - 回复:以下答案。 Symfony 通常允许通过多种方式获得相似的结果。在寻找 SF 解决方案时,研究“最佳实践”总是好的。
                • 对于新版本:$data = $form->all();
                【解决方案10】:

                我认为为了获取请求数据,通过表单对象绑定和验证,你必须使用这个命令:

                $form->getViewData();
                $form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
                

                【讨论】:

                • 这就是我要找的。我正在做的项目是symfony 2.0,无法更新。
                【解决方案11】:

                以上都不适合我。这对我有用:

                $username = $form["username"]->getData();
                $password = $form["password"]->getData();
                

                希望对你有帮助。

                【讨论】:

                • 嗯,奇怪,我用 $request->request->get('username');您是否将请求对象作为参数传递给操作?您还需要在上面包含请求类。
                【解决方案12】:

                我得到了它的工作:

                if ($request->getMethod() == 'POST') {
                    $username = $request->request->get('username');
                    $password = $request->request->get('password');
                
                    // Do something with the post data
                }
                

                您还需要将 Request $request 作为函数中的参数! 希望这会有所帮助。

                【讨论】:

                • 如果您的表单不是使用 sf2 表单生成器生成的,那么只有这会显示表单值而不是其他解决方案。 +1 伴侣
                【解决方案13】:

                如果您使用 Symfony 2 安全管理,则不需要获取发布的值,您只需要管理表单模板(请参阅documentation)。

                如果你没有使用 Symfony 2 安全管理,我强烈建议你使用它。如果你不想或者不能,你能给我们LoginType的来源吗?

                【讨论】:

                • 谢谢@BlackCharly 我开始阅读文档。我还更新了代码,让读者完全清楚。感谢您的帮助。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-12-11
                • 2017-11-01
                • 2013-04-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多