使用symfony 3,我有多个控制器和许多动作,所有这些都需要渲染和处理相同的表单。我确信有一种更简单,更简单的方法,而不是在每个控制器的每个动作中重复表单处理代码6次。
eg
Controller 1{
action1(){
//same form handling
}
action2(){
//same form handling
}
action3(){
//same form handling
}
action4(){
//same form handling
}
}
我想知道是否有人可以告诉我如何做到这一点。感谢
答案 0 :(得分:1)
您可以向Controller中添加一些辅助方法
private function getForm()
{
// Create form
return $this->createForm(YourType::class);
}
private function handleForm(Form $form, Request $request)
{
// Handle the form
$form->handleRequest($request);
// Do some stuff
}
答案 1 :(得分:0)
也许你可以创建一个可以处理请求的服务......
因此,您将在控制器,操作中创建表单,处理来自服务的请求,并在控制器中创建视图,再次执行操作以呈现它。
接缝对我来说可行...... 希望这会有所帮助。
[编辑] 如果您不想仅为此表单创建服务, 你可以:
在其中创建一个类xxxHandler,如
class xxxHandler {
public function __construct(Form $form, Request $request, EntityManager $em, $session) {
$this->form = $form;
$this->request = $request;
$this->em = $em;
$this->session = $session;
}
public function process() {
if ($this->request->getMethod() == 'POST') {
$this->form->bindRequest($this->request);
if ($this->form->isValid()) {
$this->onSuccess($this->form->getData());
return true;
}
}
return false;
}
public function onSuccess(YourEntity $entity) {
$this->em->persist($entity);
$this->em->flush();
}
}
并在您的控制器中
类似
$form = $this->createForm(new yourType, $yourEntity);
$formHandler = new ProspectHandler($form, $this->get('request'), $em, $session);
if ($formHandler->process()) {
//do wathever you want
}
PS:这是旧的symfony2方法,稍微修改它以使其在symfony3中工作