Symfony 3 - 如何在多个控制器中的多个操作中呈现和处理相同的表单,而不会复制过多的代码

时间:2016-12-09 10:06:40

标签: php symfony

使用symfony 3,我有多个控制器和许多动作,所有这些都需要渲染和处理相同的表单。我确信有一种更简单,更简单的方法,而不是在每个控制器的每个动作中重复表单处理代码6次。

eg

Controller 1{
      action1(){
      //same form handling
      }
      action2(){
      //same form handling
      }
      action3(){
      //same form handling
      }
      action4(){
      //same form handling
      }
}

我想知道是否有人可以告诉我如何做到这一点。感谢

2 个答案:

答案 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)

也许你可以创建一个可以处理请求的服务......

因此,您将在控制器,操作中创建表单,处理来自服务的请求,并在控制器中创建视图,再次执行操作以呈现它。

接缝对我来说可行...... 希望这会有所帮助。

[编辑] 如果您不想仅为此表单创建服务, 你可以:

  • mkdir捆绑包中的文件夹处理程序
  • 创建一个文件xxxHandler.php
  • 在其中创建一个类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();
    }
    }
    

并在您的控制器中

  • 实现xxxHandler并提供所需的所有参数。 (别忘了使用陈述)
  • 并在'if'
  • 中调用方法proccess()

类似

$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中工作