我正试图使用本教程使用Symfony 2.5创建一个表单,但本教程使用的是旧版本的Symfony。我可以让表单显示并创建实体,但我现在正在提交表单。以下是教程中的代码,该代码位于默认控制器contactAction
中
public function contactAction()
{
$enquiry = new Enquiry();
$form = $this->createForm(new EnquiryType(), $enquiry);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
// Perform some action, such as sending an email
// Redirect - This is important to prevent users re-posting
// the form if they refresh the page
return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));
}
}
return $this->render('BloggerBlogBundle:Page:contact.html.twig', array(
'form' => $form->createView()
));
}
我主要关心的是上面代码的以下部分
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
正如你会注意到的,它使用的是已经被取消认证的getRequest()
,然后我的IDE告诉我找不到buildRequest
方法。
如果有人打电话把我推向将contactAction
转换为symfony verion 2.5的正确道路,我将不胜感激。
像这样声明操作:
public function contactAction(Request $request)
{
...
}
和导入:
use SymfonyComponentHttpFoundationRequest;
你的操作中会有请求,所以你可以删除这行:
$request = $this->getRequest();
嗨,还有一些不推荐使用的电话,我真的建议你去看Symfony的食谱。但无论如何,下面的内容会有所帮助。
namespace myproject/mybundle/controller;
use SymfonyComponentHttpFoundationRequest;
Class Act //that is me ;) {
/**
* @Route("/contact", name="_lalalalala")
* @Template()
*/
public function contactAction(Request $request){
$enquiry = new Enquiry();
$form = $this->createForm(new EnquiryType(), $enquiry);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($enquiry);
$em->flush();
return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));
}
return ['form' => $form->createView()];
}
}
您可以使用symfony服务容器来注入您的表单,从而进一步缩短此代码。我建议您阅读这篇文章,它非常棒。由于您可以在任何地方重复使用表单:)
您可以像一样将getMethod
更改为isMethod
if ($request->isMethod('POST'))
然后您可以使用类似的submit
将请求数据提交到表单
$form->submit($request->request->get($form->getName()));
或者,你可以使用handleRequest
方法,它将一次性处理上述2种方法,然后你可以像一样继续你的其他操作
$form->handleRequest($request);
if ($form->isValid())
.. etc
要检索请求对象,有两种可能性。要么让Symfony将请求作为参数传递给控制器操作。。。
public function contactAction(Request $request)
{
// ...
}
或者从容器中获取请求对象。
$request = $this->get('request');
为了将请求绑定到表格,手册规定如下:
将请求直接传递给submit()仍然有效,但已被弃用,并将在Symfony 3.0中删除。您应该使用handleRequest()方法。
这样,请求绑定部分将类似于以下内容:
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
// do something
}
}