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


81

我正在使用以下控制器代码在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行中的数组593500内部服务器错误-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}

Answers:



92

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

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

希望对您有所帮助。


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

59

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

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

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

$data = $form->getData();

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


20

在Symfony> = 2.3中,您可以使用以下命令获取单个字段的值:

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

另一方面,您可以使用:

$data = $form->getData();

但是,这将为您带来两件事:

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

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


18

如果您有未在Entity中定义的格式的额外字段,$form->getData()则无法使用,一种方法可能是:

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

要么 :

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

谢谢!你救了我的一天!

谢谢!这很有帮助。
madshvero

如果您需要查询的ID(如果它是一个对象),则可以执行以下命令:$ form-> get('foo')-> getData()-> getId();
juanitourquiza

非常感谢您的回答,它真的很有帮助。
伊万·佛朗哥

5

在Symfony格式中,有两种不同类型的转换器和三种不同类型的基础数据: 在此处输入图片说明 在任何形式中,三种不同类型的数据是:

  • 模型数据

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

  • 规范数据

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

  • 查看资料

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

两种不同类型的转换器可帮助在以下每种类型的数据之间进行转换:

  • 型号变压器

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

  • 查看变压器

    transform():“规范数据” =>“视图数据”
    reverseTransform():“视图数据” =>“规范数据”

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

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


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

$form->getData();

如果您在特定的表单字段之后(例如first_name):

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


4

我通过它工作:

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

    // Do something with the post data
}

您还需要在函数中将Request $ 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 2015年

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

2

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

如果您不使用Symfony 2安全管理,强烈建议您使用它。如果您不愿意,或者您不愿意,可以给我们提供LoginType来源吗?


谢谢@BlackCharly我开始阅读文档。我还更新了代码,以使读者完全清楚。感谢您的帮助。
VishwaKumar 2012年


0

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

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.