2011-08-17 12 views
5

denetleyicimde kullanmak üzere bir "yönlendirme" nesnesi bulmak için şanssız çalışıyorum. _controller, _route ve argümanlarını belirten parametrelerle nesnesine benzer bir nesne olacağını umuyorum. Ben yapmaya çalışıyorum neSymfony2: Request nesnesine benzer Referrer nesnesi?

yeni dilde aynı sayfaya yönlendiren bir Dil değiştirici eylemdir. arasında doğrultuda bir şey:

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

Bunu yapmak için başka bir yol olduğunu da mümkündür - Ben raylar içinde "redirect_to: geri" olduğunu biliyorum örneğin yöntemi.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

cevap

4

Neden yerel kullanıcının oturumunu değiştirmiyorsunuz?

Öncelikle Sonra yönlendirici

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

da yerel ayarları tanımlamak,

$session->set('referrer', $request->getRequestUri()); 
arayarak oturumu Eğer oturum değişkeni kendiniz ayarlamalısınız diğer tüm kontrolörler ise

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

set

Ayrıca, her p için oturum değişkenini ayarlamak için bir olay dinleyicisi de yapabilirsiniz. otomatik olarak yaş.

+0

Tamam, teşekkürler, Gild! –

+0

Bu yazıyı yazdıktan sonra Symfony2 hakkında daha fazla şey öğrendim. Daha iyi bir uygulama bulunabilir [burada] (http://stackoverflow.com/questions/7414243/symfony2-help-please-with-backward-uri-referrer-during-switching-locale/7423276#7423276). – gilden

0

O

sınıf LocaleController Denetleyicisi {

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

} uzanır benim denetleyicisi var