2016-06-09 5 views
1

SituationSymfony, erstellen Sie eine Formulareingabe „speichern und bleiben“ Service

Ich habe einen Controller, der eine Seite bearbeitet zum Beispiel handhaben.

/** 
* 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() 
    )); 
} 

Meine Form umfassen zwei Tasten einreichen, eine der Seite zu speichern und zurück zum Index, zu retten, die Seite und bleibt in der Bearbeitungsform kommen.

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

Frage

Wenn das Formular abgeschickt wird, überprüfe ich einfach die Taste und führen Sie die richtige Aktion angeklickt wurde. Aber ich denke, dass ich dafür einen Service machen muss und ich weiß nicht genau wie. Wie man es nennt (acme.form.save_and_stay?), Wo man es speichert (AcmeBundle\Service\SaveAndStay?).

Ich habe einige Schwierigkeiten, meine Symfony App mit den Diensten zu organisieren und zu verstehen, wann ich sie verwenden soll.

Antwort

1

Ich glaube nicht, dass Sie einen Service benötigen. Sie könnten den mittleren Teil wie folgt neu schreiben:

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() 
    )); 

So würden Sie überprüfen, ob die Taste save-and-go-to-Index angeklickt wurde - wenn ja, dann dorthin umleiten. Ansonsten rendern Sie das Formular einfach mit den eingegebenen Werten.

+0

Ich dachte, der Benutzer kann das Formular mit F5 erneut senden, aber Symfony ist schlau genug, um es zu verhindern, großartig! Also brauche ich in diesem Fall wirklich keinen Service. Aber ich habe gelesen, dass ein Controller weniger als 20 Zeilen Code enthalten sollte. Nur mit dieser kleinen Form habe ich 12 Zeilen Codes. Was ist, wenn ich mehr machen muss, wie Überprüfungen und so? – AlexisWbr

+0

Zur Überprüfung und Validierung, lesen Sie diese http://symfony.com/doc/current/book/validation.html –

+0

Eine "harte Regel" eines Controllers mit weniger als 20 Zeilen ist ein bisschen extrem, denke ich. Controller sollten eher "dünn" sein, aber ich denke nicht dogmatisch nur 20 Zeilen ist eine sinnvolle Regel. Um mehr über Services zu erfahren, besuchen Sie http://symfony.com/doc/current/book/service_container.html - es braucht einige Zeit, um es wirklich zu verstehen, aber benutzen Sie es einfach ein paar Mal, und ich denke, Sie werden es tun Fang an, den Dreh raus zu bekommen. –

Verwandte Themen