Php 如何在Symfony中使表单模块化?
我在一个页面中有10个表单(它们在选项卡页面中) 我的控制器功能非常强大,为了使表单模块化,我计划只在控制器功能中显示表单,并向相应的控制器发送帖子 这10个表单中的一些在其他页面中使用,因此通过更改操作url,可以更轻松地在单独的控制器中管理它们 但是,如果表单无效,我将如何显示表单错误并阻止表单重置 如果嵌入式控制器可以重定向,我可以实现这一点。我是否错过了另一个选择 Symfony2必须有理由不允许在嵌入式控制器中进行重定向,但我想知道为什么 第三次编辑: 实际形式的图像:Php 如何在Symfony中使表单模块化?,php,forms,symfony,Php,Forms,Symfony,我在一个页面中有10个表单(它们在选项卡页面中) 我的控制器功能非常强大,为了使表单模块化,我计划只在控制器功能中显示表单,并向相应的控制器发送帖子 这10个表单中的一些在其他页面中使用,因此通过更改操作url,可以更轻松地在单独的控制器中管理它们 但是,如果表单无效,我将如何显示表单错误并阻止表单重置 如果嵌入式控制器可以重定向,我可以实现这一点。我是否错过了另一个选择 Symfony2必须有理由不允许在嵌入式控制器中进行重定向,但我想知道为什么 第三次编辑: 实际形式的图像: 图1:Step
Step1
,Step2
,等等
编辑:
这就是我所拥有的:
class DefaultController extends Controller{
public function processAction(){
$request = $this->getRequest();
/*** FORM 1 ****/
$entity = new Step1();
$form1 = $this->createForm(new Step1Type(), $entity);
if ($request->getMethod() == 'POST'){
$form1->bindRequest($request);
if($form1->isValid()){
return $this->redirect($this->generateUrl('some_link'));
}
}
/***/
//Do the same for other forms
return array(
'form1' => $form1->createView()
//[...to form10]
);
}
}
这就是我想要的:(我可以使用嵌入式控制器,但不能重定向)
我想出了4个解决方案,从最好的到最坏的顺序是:
嵌入式控制器中无重定向 问题是,如果用户按F5,它将重新发送POST数据
在表单无效的情况下保存会话中发布的数据/表单错误 和修改Symfony2内部,以允许从嵌入式控制器重定向
这两个选项不太可取,因为它会造成复杂性。@AndrzejOśmiałowski我发布了我的代码。我把它编辑得更短。你的表格(整个表格)是一种
step类型的表格吗?@AndrzejOśmiałowski不,它们被命名为step
,但它们来自完全不同的实体。我不能将其设置为多步骤表单,因为某些步骤是重复的(用户可以创建一个步骤
实体的多个实例)。让我问另一个问题:每个表单的职责是什么?@AndrzejOśmiałowski创建/编辑实体,然后将其应用于数据库。对于一些实体,我必须调用额外的方法,比如,$step1->setSomething($getSomething)
,它是最小的,但是当你将这些最小的调用乘以10,你就会得到一个大函数。另外,如果我需要使用完全相同的表单,那么我希望能够创建表单并让相应的管理员处理帖子。我仍然认为这可能是一个设计问题;)AJAX解决方案看起来不错,因为它允许您使用表单事件,这在许多情况下可能会有所帮助。
class DefaultController extends Controller{
public function processAction(){
$request = $this->getRequest();
/*** FORM 1 ****/
$entity = new Step1();
$form1 = $this->createForm(new Step1Type(), $entity);
//change $form1 action url to point to Step1Controller->createAction()
/***/
//Do the same for other forms
return array(
'form1' => $form1->createView()
//[...to form10]
);
}
}
class Step1Controller extends Controller{
public function createAction(){
$request = $this->getRequest();
$entity = new Step1();
$form = $this->createForm(new Step1Type(), $entity);
$form->bindRequest($request);
if($form->isValid()){
//save entity
return $this->redirect($this->generateUrl($getRedirectLinkFromForm));
}
return $this->redirect($this->generateUrl('some_other_link'));
}
}