2016-06-09 57 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 - 需要一些時間才能真正理解,但只需使用它幾次,我想你會開始掌握它。 –

相關問題