2011-08-17 26 views
5

Estoy intentando sin suerte encontrar un objeto "referente" para usar en mi controlador . Esperaba que hubiera un objeto similar al objeto de solicitud con parámetros que especificaban los argumentos _controller, _route y .Symfony2: ¿objeto de referencia similar al objeto de solicitud?

Lo que estoy tratando de hacer es un selector de acción lenguaje que redirige al usuario a la misma página en el nuevo idioma. Algo a lo largo de las líneas de :

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

También es posible que hay otra manera de hacer esto - Sé que en rieles existe la "redirect_to: de nuevo" método por ejemplo.

Cualquier ayuda sería muy apreciada.

Respuesta

4

¿Por qué no cambiar la configuración regional en la sesión del usuario?

En primer lugar, definir sus lugares en el router

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

A continuación, establezca la sesión

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

En todos los demás controladores debe establecer la variable de sesión a sí mismo llamando

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

También podría hacer que un detector de eventos establezca la variable de sesión para cada p edad automáticamente

+0

Ok, gracias, Gilden! –

+0

He aprendido algo más sobre Symfony2 después de escribir esta publicación. Se puede encontrar una mejor implementación [aquí] (http://stackoverflow.com/questions/7414243/symfony2-help-please-with-backward-uri-referrer-during-switching-locale/7423276#7423276). – gilden

0

Es mi controlador

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

}

Cuestiones relacionadas