我的联系表单在我的网站上的许多页面上呈现,我需要在许多不同的控制器中处理这个表单。如何在所有控制器中处理此表单? 我不想定义特殊的路由和控制器来处理这个表单,我需要在它呈现的所有页面中处理它。
现在我正在调用控制器动作女巫以这种方式呈现我的形式:
在控制器中:
$profileAskFormResponse = $this->forward('MyBundle:Profile:profileAskForm', array(
'user' => $user,
));
if ($profileAskFormResponse->isRedirection())
return $profileAskFormResponse;
return $this->render(MyBundle:Single:index.html.twig', array(
'myStuff' => $myStuff,
'profileAskForm' => $profileAskFormResponse,
));
在树枝上:
{{ profileAskForm.content|raw }}
我正在使用此代码我需要处理联系表单的每个控制器。有没有更简单的方法呢? 我的第一个想法是在树枝上做这种事情:
{% render 'MyBundle:Profile:profileAskForm' with {request: app.request, user: user} %}
但是在发送表单后我无法从那里重定向。关键是,是否有一种快速的方式来调用(例如
来自twig的这种组件,比如我的联系表单,这个组件不仅可以渲染一些东西而且还有一些应用程序逻辑。我很乐意将这种组件用作砖块的女巫,我可以放在任何地方。
答案 0 :(得分:0)
一种可能性是创建一个像Contact.php
这样的类,它将所有字段都作为类成员。然后,您可以非常轻松地将断言添加到每个字段:
/**
* @Assert\NotBlank(message="Please fill in your e-mail at least")
* @Assert\Email(checkMX = true)
*/
protected $email;
您可以为此类创建名为ContactType.php
的表单类型,并在其中使用FormBuilder
:
$builder->add('email', 'email', array('label' => 'E-mail'));
然后,您可以在所有控制器中重复使用该表单。您甚至可以使用处理所有外发电子邮件的电子邮件类扩展它,而不是将有效的联系表单注入其中:
$contact = new Contact();
$form = $this->createForm(new ContactType(), $contact);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
// now you can easily inject the class to the one that handles e-mail traffic for example
$email = new Email();
$email->sendContactForm($contact);
}
}
您可以在Symfony2 Cookbook: Forms中详细了解它。