2011-08-08 37 views
15

utilizo embedded controller para hacer la forma que se utiliza en varias páginas:redirección desde el controlador embebido

ramita

{% render 'Bundle:Controller:someForm' %} 

controlador

public function someFormAction() 
{ 
    // Some logic 

    ... 

    if ($form->isValid()) { 

     ... 

     $this->get('session')->setFlash('successful', "Woey!"); 

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

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

Necesito volver a dirigir de nuevo a la página principal después de que el formulario se envió correctamente como parte de post-redirect-get patrón de diseño. Si lo uso como lo describí anteriormente, recibiré una excepción ya que la respuesta del controlador incrustado fue de 302 en lugar de 200 (al menos espero que funcione así).

¿Es posible redirigir normalmente en tal escenario? ¿O me estoy acercando a la situación (con la forma que se representa en varias páginas) desde un ángulo totalmente erróneo?

+0

Hey Ondrej ¿alguna vez lograste encontrar una manera limpia de lograr esto (o tu otra pregunta sobre la reutilización de formularios en otra página)? Solo tengo curiosidad ya que estoy enfrentando exactamente el mismo problema. Parece que podría ser un problema común si tiene un formulario de búsqueda en todo el sitio o algo así. La única forma en que puedo pensar es publicando en la ruta someFormAction directamente y luego usando un redireccionamiento a la URL original y almacenando las variables de formulario en la sesión ... aunque parece un poco sucio. – Kasheen

+0

Parece que funciona de la manera prevista. Estoy usando la misma técnica que describiste. Investigué un poco más y ni siquiera puedes acceder al alcance principal desde dentro de la acción incrustada. Eso ayudaría mucho. –

+0

Ok gracias. Pensé que usar la sesión podría ser el camino a seguir: si miras la Autenticación de Formulario de Acceso incorporada, hace lo mismo (almacena el nombre de usuario y la contraseña en la sesión) y luego redirige a alguna URL en la configuración o a través de un campo oculto (creo). Sería mucho más claro si una acción incrustada podría redirigir mediante POSTING a la ruta de acción primaria, lástima que no funciona. Gracias por la ayuda. :) – Kasheen

Respuesta

0

Quizás esto te ayude. Utilizo esto para mostrar 404 páginas si no se encontró un recurso en un controlador incrustado.

try 
{ 
    return $this->render('MyBundle:Table:list.html.twig', $data); 
} 
catch(\Twig_Error_Runtime $e) 
{ 
    if($e->getPrevious() instanceof NotFoundHttpException) 
    { 
     throw $this->createNotFoundException(); 
    } 
    else throw $e; 
} 

Se podría hacer una RedirectHttpException, que obstaculicen sus datos de redirección, y tirarlo en su controlador embebido. Luego redirija a su controlador principal.

Cuestiones relacionadas