2013-06-24 12 views
10

voglio separare la logica di convalida modulo:Symfony 2 - la logica forma separata, mostrano errori di forma dopo il redirect

public function contactAction() 
{ 
    $form = $this->createForm(new ContactType()); 

    $request = $this->get('request'); 
    if ($request->isMethod('POST')) { 
     $form->submit($request); 
     if ($form->isValid()) { 
      $mailer = $this->get('mailer'); 
      // .. setup a message and send it 

      return $this->redirect($this->generateUrl('_demo')); 
     } 
    } 

    return array('form' => $form->createView()); 
} 

voglio tradurre in 2 azioni separate:

public function contactAction() 
{ 
    $form = $this->createForm(new ContactType()); 
    return array('form' => $form->createView()); 
} 

public function contactSendAction() 
{ 
    $form = $this->createForm(new ContactType()); 
    $request = $this->get('request'); 
    if ($request->isMethod('POST')) { 
     $form->submit($request); 
     if ($form->isValid()) { 
      $mailer = $this->get('mailer'); 
      // .. setup a message and send it using 

      return $this->redirect($this->generateUrl('_demo')); 
     } 
    } 
    // errors found - go back 
    return $this->redirect($this->generateUrl('contact')); 
} 

Il problema è che quando esistono errori nel modulo - dopo la convalida del modulo e il reindirizzamento del NON mostrato nell'Avviso di contatto. (probabilmente saranno già dimenticati dopo il reindirizzamento - il contesto degli errori verrà perso)

risposta

6

Se si controlla come il codice generato da CRUD generator gestisce ciò, si noterà che una convalida del modulo non riuscita restituisce un reindirizzamento, ma utilizza invece il stessa vista del metodo GET. Quindi, nel tuo esempio, devi semplicemente:

return $this->render("YourBundle:Contact:contact.html.twig", array('form' => $form->createView())) 

anziché restituire il reindirizzamento. Ciò significa che non si perdono gli errori di modulo come si fa in un reindirizzamento. Qualcos'altro che il generatore CRUD aggiunge è il Method requirement che significa che è possibile specificare che il ContactSendAction richiede il metodo POST e quindi non è necessario l'ulteriore if($request->isMethod('POST')){ istruzione.

È anche possibile restituire un array se si specifica il modello altrove, per esempio si potrebbe utilizzare il @Template annotation e poi basta

return array('form' => $form->createView()) 
+0

grazie per informazioni sui requisiti del metodo e utilizzo della vista di ritorno anziché del reindirizzamento. Ma se userò view invece sarà lo stesso di come era - 2 logiche non sono più separate. C'è un modo per utilizzare il reindirizzamento e NON PERDERE errori di forma? – pleerock

+0

Reindirizzare e non perdere i dati dei moduli non sembra l'idea giusta. È possibile impostare gli errori nella sessione e aggiungerli al modulo ma è pieno di potenziali difetti. Cosa stai cercando di allontanarti dalla separazione logica? Potresti potenzialmente restituire $ this-> contactAction(); 'se lo volessi? – Luke

+0

Scusate il mio ultimo commento su return $ this-> contactAction(); ero io spit-balling e non ben considerato – Luke

2

Questo sembra funzionare per me in Symfony 2.8:

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class MyController extends Controller { 
    public function templateAction() 
    { 
     $form = $this->createForm(new MyFormType(), $myBoundInstance); 

     if ($session->has('previousRequest')) { 
      $form = $this->createForm(new MyFormType()); 
      $form->handleRequest($session->get('previousRequest')); 
      $session->remove('previousRequest'); 
     } 

     return array(
      'form' => $form->createView(), 
     ); 
    } 

    public function processingAction(Request $request) 
    { 

     $form = $this->createForm(new MyFormType(), $myBoundInstance); 
     $form->handleRequest($request); 

     if ($form->isValid()) { 
      // do some stuff 
      // ... 

      return redirectToNextPage(); 
     } 

     $session->set('previousRequest', $request); 

     // handle errors 
     // ... 

     return redirectToPreviousPage(); 
    } 
} 

Si prega di notare che redirectToNextPage e redirectToPreviousPage, nonché MyFormType, sono pseudo codice. Dovresti sostituire questi bit con la tua logica.

Problemi correlati