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

Posted

技术标签:

【中文标题】如何在 Symfony2 控制器中获取表单值【英文标题】:How to get form values in Symfony2 controller 【发布时间】: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

【问题讨论】:

【参考方案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 我开始阅读文档。我还更新了代码,让读者完全清楚。感谢您的帮助。

以上是关于如何在 Symfony2 控制器中获取表单值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony2 控制器中获取用户 IP 地址?

从控制器 Symfony2 中的 URL 获取参数

如何在 symfony2 控制器中发送 JSON 响应

Symfony2:KnpPaginator 仅显示带有 POST 表单的第一页

访问 Symfony2 请求对象中的 POST 值

如何在 Symfony2 控制器中获取操作名称?