如何在Symfony2控制器中获取表单值

85

我正在使用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]:第一个参数不是数组,位于\vendor\symfony\src\Symfony\Component\Form\Form.php的第593行 500 内部服务器错误 - ErrorException

请问有人能帮我理解这是什么问题,并且如何解决它?谢谢。

更新: twig 文件大致如下:

<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}
13个回答

101

简单来说:

$data = $form->getData();

2
好答案 - 回复以下答案。Symfony通常允许使用多种方式获得类似的结果。在寻找SF解决方案时,研究“最佳实践”总是很好的选择。 - JustinP
11
新版本的代码:$data = $form->all(); 翻译成中文:获取所有表单数据并存储到变量$data中。 - Gmajoulet

99

以上的方法都对我无效。这个方法适用于我:

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

希望这可以帮到你。


2
嗯,奇怪了,我用 $request->request->get('username'); 让它工作了。你是否将请求对象作为参数传递给操作?并且你需要在上面包含 Request 类。 - VishwaKumar

61

在Symfony 2中(更具体地说,是2.3版本),您可以通过以下方式获取字段的数据

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

或者您可以获取所有发送的数据

$data = $form->getData();

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


21
在Symfony >= 2.3中,您可以使用以下代码获取单个字段的值:
$var = $form->get('yourformfieldname')->getData();

另一方面,您可以使用:

$data = $form->getData();

但是,这将为您带来两种不同的东西:

  • 如果您的表单启用了data-class选项(因此它绑定到一个实体),则具有填充值的实体将被获取;这将排除任何具有'mapping' => false选项的字段。

  • 否则,将得到包含所有表单字段的数组。


19

如果表单中有未在实体中定义的额外字段,$form->getData()将无效,其中一种解决方法是:

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

或:

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

谢谢!你救了我的一天! - user985818
谢谢!这帮了很多忙。 - madsroskar
如果您需要查询的ID是一个对象,您可以执行以下命令:$form->get('foo')->getData()->getId(); - juanitourquiza
非常感谢您的回答,它真的很有帮助。 - Ivan Franco

8

6
在Symfony 表单中,有两种不同类型的转换器和三种不同类型的底层数据: enter image description here 在任何表单中,这三种不同类型的数据是:
  • 模型数据

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

  • 规范化数据

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

  • 视图数据

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

两种不同类型的转换器帮助将数据从每种类型转换为另一种类型:

  • 模型转换器:

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

  • 视图转换器:

    transform(): "规范化数据" => "视图数据"
    reverseTransform(): "视图数据" => "规范化数据"

根据您的情况选择所需的转换器。

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


如果您想获取所有表单数据:
$form->getData();

如果您需要获取特定的表单字段(例如first_name):

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

现在你也可以使用 $form->all(),它将检索甚至未映射的字段。 - S. Dre

4

我通过以下方法让它工作:

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

你需要在函数中将请求$request作为参数传递进去!希望这能有所帮助。

如果您的表单不是使用sf2表单构建器生成的,则只有这个才会显示您的表单值,而不是其他解决方案。 +1 伙计 - Nikhil Chaudhary

4

为了获取通过表单对象绑定和验证的请求数据,你需要使用以下命令:

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

这正是我在寻找的。我正在处理的项目使用Symfony 2.0,无法更新。 - Naomi

3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

如果您的表单有子表单,则此代码应如下所示:$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData(); - Aliance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接