Symfony2: объект реферера похож на объект запроса? - PullRequest
5 голосов
/ 17 августа 2011

Я безуспешно пытаюсь найти объект "реферер" для использования в моем контроллере.Я ожидал, что будет объект, похожий на объект запроса, с параметрами, определяющими _controller, _route и arguments.

Я пытаюсь выполнить действие language switcher , которое перенаправляет пользователя на той же странице на новом языке .Что-то вроде:

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

Также возможно, что есть другой способ сделать это - я знаю, что в rails есть метод "redirect_to: back", например.

Любойпомощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

Почему бы не изменить языковой стандарт в сеансе пользователя?

Сначала определите ваши локали в роутере

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

Затем установите сеанс

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

Во всех других контроллерах вы должны установить переменную сеанса самостоятельно, вызвав

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

Возможно, вы также можете сделать прослушиватель событий для автоматической установки переменной сеанса для каждой страницы.

0 голосов
/ 25 декабря 2011

Это мой контроллер

Класс 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();
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...