2011-08-17 12 views
5

Sto provando senza fortuna a trovare un oggetto "referrer" da utilizzare nel mio controller . Mi aspettavo che ci fosse un oggetto simile alla richiesta oggetto con parametri che specificano gli argomenti _controller, _route e .Symfony2: oggetto Referrer simile all'oggetto Request?

Quello che sto cercando di fare è un lingua switcher azione che reindirizza l'utente alla stessa pagina nella nuova lingua. Qualcosa lungo le linee di :

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

E 'anche possibile che ci sia un altro modo per fare questo - so che in rotaie c'è la "redirect_to: torna" metodo per esempio.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

4

Perché non modificare le impostazioni internazionali nella sessione dell'utente?

In primo luogo, definire le impostazioni internazionali nel router

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

Quindi, impostare la sessione

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

In tutti gli altri controller è necessario impostare la variabile di sessione da soli chiamando

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

Probabilmente potresti anche creare un listener di eventi per impostare la variabile di sessione per ogni p età automaticamente.

+0

Ok, grazie, Gilden! –

+0

Ho imparato qualcosa in più su Symfony2 dopo aver scritto questo post. È possibile trovare un'implementazione migliore [qui] (http://stackoverflow.com/questions/7414243/symfony2-help-please-with-backward-uri-referrer-during-switching-locale/7423276#7423276). – gilden

0

E 'il mio controller

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

}