2011-08-08 12 views
15

używam embedded controller uczynić formularz, który jest używany na wielu stronach:Przekierowanie z wbudowanym kontrolerem

Gałązka

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

Controller

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

muszę przekierować z powrotem do strony głównej po tym, jak formularz został pomyślnie przesłany jako część post-redirect-get wzór. Jeśli użyję go tak, jak opisano powyżej, otrzymam wyjątek, ponieważ odpowiedź z wbudowanego kontrolera wynosiła 302 zamiast 200 (przynajmniej spodziewam się, że działa w ten sposób).

Czy w takim scenariuszu można normalnie przekierować? Czy podchodzę do sytuacji (z formularzem renderowanym na wielu stronach) pod zupełnie niewłaściwym kątem?

+0

Hej Ondrej czy kiedykolwiek udało ci się znaleźć czysty sposób, aby to osiągnąć (lub inne pytanie dotyczące ponownego użycia formularza na innej stronie)? Jestem tylko ciekawy, ponieważ mam do czynienia z dokładnie tym samym problemem. Wydaje się, że może to być powszechny problem, jeśli masz formularz wyszukiwania w całej witrynie lub coś takiego. Jedyny sposób, jaki mogę wymyślić, to umieszczenie bezpośrednio na trasie someFormAction, a następnie użycie przekierowania z powrotem do oryginalnego adresu URL i przechowywanie zmiennych formularza w sesji ... wydaje się jednak trochę brudne. – Kasheen

+0

Wygląda na to, że działa tak jak zamierzano. Używam tej samej techniki, którą opisałeś. Przeprowadziłem dalsze badania i nie można uzyskać dostępu do zakresu nadrzędnego z poziomu działania osadzonego. To by bardzo pomogło. –

+0

Ok dzięki. Myślałem, że korzystanie z sesji może być drogą do zrobienia - jeśli spojrzysz na wbudowane uwierzytelnianie formularza logowania, robi to samo (zapisuje nazwę użytkownika i hasło w sesji), a następnie przekierowuje do jakiegoś adresu URL w konfiguracji lub poprzez pole ukryte (myślę). Byłoby o wiele czystsze, gdyby akcja osadzona mogła przekierować przez POSTing do macierzystej trasy działania, ale szkoda, że ​​to nie działa. Dzięki za pomoc. :) – Kasheen

Odpowiedz

0

Może to ci pomoże. Używam tego do wyświetlania 404 stron, jeśli nie znaleziono zasobu w wbudowanym kontrolerze.

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; 
} 

Można zrobić RedirectHttpException, które utrudniałyby danych przekierowania i rzucać je w swojej wbudowanego kontrolera. Następnie przekieruj do kontrolera nadrzędnego.

Powiązane problemy