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

我正在Symfony2上使用以下控制器代码的login表单

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 Internal Server Error – 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> 

这是表单的types中的函数

 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} 

简单说:

 $data = $form->getData(); 

以上都没有为我工作。 这适用于我:

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

我希望它有帮助。

在Symfony 2(更具体的说,2.3版本)中,你可以通过获取一个字段的数据

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

或者你可以得到所有的数据发送

 $data = $form->getData(); 

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

在Symfony> = 2.3中,可以通过以下方式获得单个字段的值:

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

另一方面,您可以使用:

 $data = $form->getData(); 

但是这会给你两个不同的东西:

  • 如果您的表单启用了data-class选项(因此它被绑定到一个实体),那么该实体的值将由表单填充。 这将排除任何与'mapping' => false选项的字段

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

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

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

要么 :

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

我认为为了获取请求数据,通过表单对象进行绑定和validation,您必须使用以下命令:

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

在Symfony 表单中 ,有两种不同types的变换器和三种不同types的基础数据: 在这里输入图像说明 以任何forms,三种不同types的数据是:

  • 模型数据

    这是您的应用程序中使用的格式的数据(例如问题对象)。 如果你调用Form::getData()Form::setData() ,你正在处理“model”数据。

  • 规范数据

    这是数据的标准化版本,通常与“模型”数据相同(尽pipe在本例中不是这样)。 这不是直接使用。

  • 查看数据

    这是用来填写表单字段的格式。 这也是用户提交数据的格式。 当你调用Form::submit($data) ,$ data是“view”数据格式。

两种不同types的转换器可以帮助转换为以下每种types的数据:

  • 模型变压器

    transform() :“model data”=>“norm data”
    reverseTransform() :“norm data”=>“模型数据”

  • 查看变压器

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

你需要哪个变压器取决于你的情况。

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


如果你想获得所有的表单数据:

 $form->getData(); 

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

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

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

如果你没有使用Symfony 2安全pipe理,我build议你强烈使用它。 如果你不想,或者你不能,你能给我们的LoginType的来源?

我得到了这个工作:

 if ($request->getMethod() == 'POST') { $username = $request->request->get('username'); $password = $request->request->get('password'); // Do something with the post data } 

您也需要将Request $ request作为函数中的参数! 希望这可以帮助。