2011-08-17 7 views
5

Próbuję bez powodzenia znaleźć obiekt "referrer" do użycia w moim kontrolerze . Spodziewałem się, że obiekt będzie podobny do obiektu żądania o parametrach określających argumenty _controller, _route i .Symfony2: Polecany obiekt podobny do obiektu Request?

Co staram się robić to język przełącznik działanie, które przekierowuje użytkownikowi do tej samej strony w nowym języku. Coś wzdłuż linii:

public function switchLangAction($_locale) 
{ 
    $args = array(); 
    $newLang = ($_locale == 'en') ? 'fr' : 'en'; 

    // this is how I would have hoped to get a reference to the referrer request. 
    $referrer = $this->get('referrer'); 
    $referrerRoute = $referrer->parameters->get('_route'); 
    $args = $referrer->parameters->get('args'); // not sure how to get the route args out of the params either! 
    $args['_locale'] = $newLang; 

    $response = new RedirectResponse($this->generateUrl(
     $referrerRoute, 
     $args 
    )); 

    return $response; 
} 

Możliwe jest również, że istnieje inny sposób to zrobić - Znam w szynach tam jest „redirect_to: back” metoda na przykład.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

4

Dlaczego nie zmienić ustawienia narodowego w sesji użytkownika?

pierwsze, określić swoje lokalizacje w routerze

my_login_route: 
    pattern: /lang/{_locale} 
    defaults: { _controller: AcmeDemoBundle:Locale:changeLang } 
    requirements: 
     _locale: ^en|fr$ 

Następnie ustawić sesję

namespace Acme\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class LocaleController extends Controller 
{ 
    public function switchLangAction($_locale, Request $request) 
    { 
     $session = $request->getSession(); 
     $session->setLocale($_locale); 
     // ... some other possible actions 

     return $this->redirect($session->get('referrer')); 
    } 
} 

We wszystkich innych sterowników należy ustawić zmienną samodzielnie sesji wywołując

$session->set('referrer', $request->getRequestUri()); 

Prawdopodobnie można również utworzyć detektor zdarzeń, aby ustawić zmienną sesji dla każdego p wiek automatycznie.

+0

Ok, dzięki, Gilden! –

+0

Dowiedziałem się więcej o Symfony2 po napisaniu tego posta. Lepszą implementację można znaleźć [tutaj] (http://stackoverflow.com/questions/7414243/symfony2-help-please-with-backward-uri-referrer-during-switching-locale/7423276#7423276). – gilden

0

To mój kontroler

klasa LocaleController rozciąga Controller {

public function indexAction() 
{ 
    if(null === $this->getRequest()->getLocale()){ 
     $locale = $this->getRequest()->getPreferredLanguage($this->getLocales()); 
     $this->getRequest()->setLocale($locale); 
    } 
    else{ 
     $locale = $this->getRequest()->getLocale(); 
    } 

    return $this->redirect($this->generateUrl('corebundle_main_index', array('_locale' => $locale))); 
} 

public function changeLocaleAction($_locale) 
{ 
    $request = $this->getRequest(); 
    $referer = $request->headers->get('referer'); 
    $locales = implode('|',$this->getLocales()); 
    $url = preg_replace('/\/('.$locales.')\//', '/'.$_locale.'/', $referer, 1); 
    return $this->redirect($url); 
} 

private function getLocales() 
{ 
    return array('ru', 'uk', 'en'); 
} 


/** 
* @Template() 
*/ 
public function changeLocaleTemplateAction() 
{ 
    return array(); 
} 

}

Powiązane problemy