2011-08-17 34 views
5

我試圖找到一個「referrer」對象用於我的 控制器。我預計會有一個類似於請求 對象的對象,該對象的參數指定_controller,_route和 參數。Symfony2:引用類似於請求對象的對象?

我所試圖做的是一個語言切換行動重定向 新的語言用戶到同一頁面。沿着 線的東西:

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

這也有可能是有另一種方式來做到這一點 - 我知道 軌有「redirect_to的:背」爲例方法。

任何幫助將不勝感激。

回答

4

爲什麼不更改用戶會話中的語言環境?

首先,在路由器

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

定義的語言環境。然後,通過調用

$session->set('referrer', $request->getRequestUri()); 
設置會話

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

在你應該爲自己設定會話變量的所有其他控制器

你也可以讓事件監聽器爲每個p設置會話變量自動年齡。

+0

好的,謝謝,gilden! –

+0

在寫這篇文章後,我已經瞭解了更多關於Symfony2的知識。更好的實現可以在這裏找到(http://stackoverflow.com/questions/7414243/symfony2-help-please-with-backward-uri-referrer-during-switching-locale/7423276#7423276)。 – gilden

0

這是我的控制器

類LocaleController擴展控制器{

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

}