如何在 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->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' => false
选项的字段
否则,一个包含所有表单字段的数组
【讨论】:
【参考方案7】: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();
【参考方案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 控制器中获取表单值的主要内容,如果未能解决你的问题,请参考以下文章