Symfony3 добавить локаль в deeplink - PullRequest
0 голосов
/ 29 октября 2018

Я создаю новый сайт в Symfony3, следуя разделу «Начало работы» в официальной документации Symfony в https://symfony.com/doc/current/setup.html

Все работает нормально ... если я добавлю mydomain.com в качестве URL-адреса, фреймворк add / en или правильный local.

У меня вопрос, есть ли способ, если пользователь делает диплинк на mydomain.com/blog, фреймворк обнаружит, что локальный файл отсутствует, поэтому он может добавить и преобразовать URL в mydomain.com/en/blog

Я не добавляю код, так как он используется по умолчанию. Дайте мне знать, если вам это нужно.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Благодаря @dbrumann я добираюсь до этого решения ... Конечно, можно улучшить использование меньшего количества кода, но это просто помогло.

Я обновил метод onKernelRequest в классе RedirectToPreferredLocaleSubscriber

public function onKernelRequest(GetResponseEvent $event): void
    {
        $request = $event->getRequest();
        $path = explode('/',$request->getPathInfo());
        $hasLocale = false;
        foreach ($this->locales as $key => $l) {
            if($l == $path[1]){
                $hasLocale = true;
            }
        }
        if(!$hasLocale){
            // Ignore sub-requests and all URLs but the homepage
            if (!$event->isMasterRequest() || '/' !== $request->getPathInfo()) {
                $preferredLanguage = $request->getPreferredLanguage($this->locales);
                if ($preferredLanguage !== $this->defaultLocale) {
                    $url = "";
                    foreach ($path as $key => $p) {
                        if($key > 0){
                            $url .= "/" . $p;
                        }
                    }
                    //print_r('/' . $preferredLanguage . $url);exit;
                    $response = new RedirectResponse('/' . $preferredLanguage . $url);
                    $event->setResponse($response);
                }
            }
            else{
                // Ignore requests from referrers with the same HTTP host in order to prevent
                // changing language for users who possibly already selected it for this application.
                if (0 === mb_stripos($request->headers->get('referer'), $request->getSchemeAndHttpHost())) {
                    return;
                }

                $preferredLanguage = $request->getPreferredLanguage($this->locales);
                if ($preferredLanguage !== $this->defaultLocale) {
                    $response = new RedirectResponse($this->urlGenerator->generate('homepage', ['_locale' => $preferredLanguage]));
                    $event->setResponse($response);
                }
            }
        }
    }
0 голосов
/ 29 октября 2018

Есть несколько способов сделать это.Вероятно, проще всего иметь EventSubscriber или -Listener, который перехватывает запрос без локали, а затем обрабатывает добавление этой информации.Поскольку вы основали свой проект на демонстрационном приложении, вы можете посмотреть на его решение: https://github.com/symfony/demo/blob/master/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php

Шаги, выполняемые в обработчике событий, примерно такие:

  1. Прослушиваниеkernel.request событие
  2. Вернуть досрочно на основе некоторых критериев, например, домашней страницы, установлен файл cookie с языком или что-то еще
  3. Определить язык, получив языковой стандарт по умолчанию или определив из вашегодоступные локали и заголовок браузера, какой язык подходит лучше всего (см .: https://github.com/willdurand/Negotiation#language-negotiation)
  4. Перенаправление, добавление локали в качестве атрибута для запроса, запись текущего установленного языка в файл cookie или что-либо еще, что вам нужно сделать, чтобы изменитьМаршрут
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...