2016-06-09 55 views
1

形势的Symfony,创建一个表单输入“保存并保持”服务

我有一个控制器,该控制器处理例如页面编辑。

/** 
* Update a page 
* @ParamConverter("page", class="AcmeBundle:Page", options={"id" = "page_id"}) 
*/ 
public function editAction(Page $page, Request $request) 
{ 
    $form = $this->createForm(PageType::class, $page); 

    if ($form->handleRequest($request)->isSubmitted() && $form->isValid()) { 
     $this->getDoctrine()->getManager()->flush(); 

     $this->addFlash('success', 'page_admin.flash.updated'); 

     if ($form->get('save_and_stay')->isClicked()) { 
      return $this->redirect($request->headers->get('referer')); 
     } 
     else { 
      return $this->redirectToRoute('acme_page_admin_index'); 
     } 
    } 

    return $this->render('AcmeBundle:PageAdmin:edit.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

我的表单包含两个提交按钮,一个保存页面,然后回来到索引中,一个保存页面,并留在编辑表单。

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('headline') 
     ->add('body') 
     ->add('save', SubmitType::class) 
     ->add('save_and_stay', SubmitType::class) 
    ; 
} 

问题

当提交表单时,我只需检查被点击了哪个按钮,并执行正确的行动。但我想我需要为此提供服务,但我不知道如何。如何命名(acme.form.save_and_stay?),在哪里存储(AcmeBundle\Service\SaveAndStay?)。

我有一些困难,组织我的Symfony应用程序的服务,并了解当我应该使用它们。

回答

1

我不认为你需要服务。你可以重新写中间部分是这样的:

if ($form->handleRequest($request)->isSubmitted() && $form->isValid()) { 

     [...] 

     if ($form->get('save')->isClicked()) { 
      return $this->redirectToRoute('acme_page_admin_index'); 
     } 
    } 
    return $this->render('AcmeBundle:PageAdmin:edit.html.twig', array(
     'form' => $form->createView() 
    )); 

所以,你会检查保存并进入到指数被点击的按钮是否 - 如果是,则重定向到那里。否则,只需使用插入的值再次显示表单。

+0

我以为用户将能够重新发送与F5的形式,但Symfony足够聪明,以防止它,太棒了! 所以我真的不需要任何服务在这种情况下。但我读过一个控制器应该包含少于20行的代码。就这个小表格,我有12行代码。如果我需要更多的东西,比如验证和东西,会怎样? – AlexisWbr

+0

对于检查和验证,请阅读http://symfony.com/doc/current/book/validation.html –

+0

控制器少于20行的“硬规则”,我觉得有点极端。控制者应该相当“瘦”,但我不认为教条只有20行是一个有用的规则。 要了解有关服务的更多信息,请查看http://symfony.com/doc/current/book/service_container.html - 需要一些时间才能真正理解,但只需使用它几次,我想你会开始掌握它。 –

相关问题