BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Как брать локали для роутов из БД?

https://symfony.com/doc/current/routing/service_co...

Однако, если админ может менять какие локали? К примеру если он добавит локаль новую?

# config/services.yaml
parameters:
    app.locales: en|es // а мои локали идет из БД
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
  • BoShurik
    @BoShurik
    Как сказал Minifets, через роутинг такое сделать сложно, проще через event_dispatcher:

    class SiteController
    {
        /**
         * @Route(path="/{_locale}/", name="index_locale")
         * @Route(path="/", name="index")
         */
        public function indexAction(Request $request)
        {
            return new Response($request->getLocale());
        }
    }


    namespace App\EventSubscriber;
    
    use App\LocaleProvider;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    use Symfony\Component\HttpKernel\KernelEvents;
    
    class LocaleSubscriber implements EventSubscriberInterface
    {
        /**
         * @var LocaleProvider
         */
        private $localeProvider;
    
        public function __construct(LocaleProvider $localeProvider)
        {
            $this->localeProvider = $localeProvider;
        }
    
        /**
         * @inheritDoc
         */
        public static function getSubscribedEvents()
        {
            return [
                KernelEvents::REQUEST => 'onKernelRequest',
            ];
        }
    
        public function onKernelRequest(GetResponseEvent $event)
        {
            if (!$event->isMasterRequest()) {
                return;
            }
    
            $request = $event->getRequest();
    
            if (!in_array($request->getLocale(), $this->localeProvider->getLocales())) {
                throw new NotFoundHttpException(sprintf('Unknown locale %s', $request->getLocale()));
            }
        }
    }


    namespace App;
    
    class LocaleProvider
    {
        public function getLocales()
        {
            return ['ru', 'en'];
        }
    }


    P.S.: Может пригодиться: https://github.com/lunetics/LocaleBundle
    Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы