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

Vis*_*mar 78 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()));
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下警告:

警告: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>
Run Code Online (Sandbox Code Playgroud)

这是Form's Type中的函数

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

这是路线:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}
Run Code Online (Sandbox Code Playgroud)

Hub*_*ron 92

简单地说

$data = $form->getData();
Run Code Online (Sandbox Code Playgroud)

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

pko*_*out 90

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

$username = $form["username"]->getData();
$password = $form["password"]->getData();
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.

  • 嗯,很奇怪,我用$ request-&gt; request-&gt; get('username'); 您是否将请求对象作为参数传递给操作?并且您还需要在上面包含请求类。 (2认同)

alb*_*ert 57

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

$var = $form->get('yourformfieldname')->getData();
Run Code Online (Sandbox Code Playgroud)

或者你可以发送所有数据

$data = $form->getData();
Run Code Online (Sandbox Code Playgroud)

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


Jea*_*ean 20

在Symfony> = 2.3中,您可以获得单个字段的值:

$var = $form->get('yourformfieldname')->getData();
Run Code Online (Sandbox Code Playgroud)

另一方面,您可以使用:

$data = $form->getData();
Run Code Online (Sandbox Code Playgroud)

,这将让你两种不同的东西:

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

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


Sam*_*adi 15

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

$request->get("form")["foo"] 
Run Code Online (Sandbox Code Playgroud)

要么 :

$form->get('foo')->getData();
Run Code Online (Sandbox Code Playgroud)


PJa*_*ely 7

要获取特定字段的数据,

$form->get('fieldName')->getData();
Run Code Online (Sandbox Code Playgroud)

或者对于所有表单数据

$form->getData();
Run Code Online (Sandbox Code Playgroud)

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


Pmp*_*mpr 5

在Symfony 表单中,有两种不同类型的转换器和三种不同类型的底层数据: 在此输入图像描述 在任何形式中,三种不同类型的数据是:

  • 模型数据

    这是应用程序中使用的格式的数据(例如,Issue对象).如果你打电话Form::getData()Form::setData(),你正在处理"模型"数据.

  • 规范数据

    这是数据的标准化版本,通常与"模型"数据相同(尽管不在我们的示例中).它并不常用.

  • 查看数据

    这是用于填写表单字段本身的格式.它也是用户提交数据的格式.当您致电时Form::submit($data),$ data采用"查看"数据格式.

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

  • 模型变压器:

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

  • 查看变形金刚:

    transform():"norm data"=>"查看数据"
    reverseTransform():"查看数据"=>"标准数据"

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

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


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

$form->getData();
Run Code Online (Sandbox Code Playgroud)

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

$form->get('first_name')->getData();
Run Code Online (Sandbox Code Playgroud)