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

时间:2012-01-24 13:14:08

标签: forms symfony

我在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

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

更新: 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 个答案:

答案 0 :(得分:92)

简单地说:

$data = $form->getData();

答案 1 :(得分:90)

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

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

我希望它有所帮助。

答案 2 :(得分:57)

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

获取字段数据
$var = $form->get('yourformfieldname')->getData();

或者您可以发送所有数据

$data = $form->getData();

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

答案 3 :(得分:20)

在Symfony&gt; = 2.3中,您可以使用以下内容获取单个字段的值:

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

另一方面,您可以使用:

$data = $form->getData();

这会让你有两件事:

  • 如果您的表单启用了data-class选项,则表单填充了值的实体(因此它与实体绑定);这将使用'mapping' => false选项

  • 排除任何字段
  • 否则,包含所有表单字段的数组

答案 4 :(得分:15)

如果您在实体中未定义的表单中有额外字段,$form->getData()不起作用,则可以采用以下方法:

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

或者:

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

答案 5 :(得分:5)

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

  • 模型数据

    这是您的应用程序中使用的格式的数据(例如,Issue对象)。如果您致电Form::getData()Form::setData(),则需要处理&#34;型号&#34;数据

  • 规范数据

    这是您的数据的标准化版本,通常与您的&#34;型号&#34;相同。数据(虽然不在我们的例子中)。它并不常用。

  • 查看数据

    这是用于填写表单字段本身的格式。它也是用户提交数据的格式。当您拨打Form::submit($data)时,$ data位于&#34;视图&#34;数据格式。

两种不同类型的变换器有助于转换为每种类型的数据:

  • 模型变换器

    transform():&#34;模型数据&#34; =&GT; &#34;规范数据&#34;
    reverseTransform():&#34;规范数据&#34; =&GT; &#34;模型数据&#34;

  • 查看变换器

    transform():&#34;规范数据&#34; =&GT; &#34;查看数据&#34;
    reverseTransform():&#34;查看数据&#34; =&GT; &#34;规范数据&#34;

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

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

如果您想获取所有表单数据:

$form->getData();

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

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

答案 6 :(得分:4)

我得到了它的工作:

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

    // Do something with the post data
}

您还需要将Request $请求作为参数添加到函数中! 希望这会有所帮助。

答案 7 :(得分:4)

我认为为了获取由表单对象绑定和验证的请求数据,您必须使用以下命令:

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

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

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

答案 10 :(得分:2)

要获取特定字段的数据,

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

或者对于所有表单数据

$form->getData();

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

答案 11 :(得分:1)

如果使用Symfony 4或5,请使用以下代码(名称是您的字段名称):

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

答案 12 :(得分:0)

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