10

翻訳を目的としていないアプリケーションを作成しましたが、この機能を追加することにしました。問題は、すべてのルートが次のようになっていることです。

goodbye:
    pattern: /goodbye
    defaults: { _controller: AcmeBudgetTrackerBundle:Goodbye:goodbye }

そして、私はそれらが今このようになりたいです:

goodbye:
    pattern: /goodbye/{_locale}
    defaults: { _controller: AcmeBudgetTrackerBundle:Goodbye:goodbye, _locale: en }
    requirements:
        _locale: en|bg

私は本当にこれを行う必要がありますか?また、よりグローバルまたは自動で行う方法、またはすべての URL で同じであるため、少なくとも 1 回だけ要件を追加する方法はありますか? よろしくお願いします!

4

6 に答える 6

3

すべてのルートまたはグローバル スコープに要件を設定するよりも優れた解決策は、EventListener を使用してユーザーを同じルートにリダイレクトすることですが、サポートされているロケールを使用します。例:

<?php

namespace Selly\WebappLandingBundle\EventListener;

use Symfony\Component\HttpFoundation\RedirectResponse;

use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleInParamListener implements EventSubscriberInterface
{
    /**
     * @var Symfony\Component\Routing\RouterInterface
     */
    private $router;

    /**
     * @var string
     */
    private $defaultLocale;

    /**
     * @var array
     */
    private $supportedLocales;

    /**
     * @var string
     */
    private $localeRouteParam;

    public function __construct(RouterInterface $router, $defaultLocale = 'en_US', array $supportedLocales = array('en_US'), $localeRouteParam = '_locale')
    {
        $this->router = $router;
        $this->defaultLocale = $defaultLocale;
        $this->supportedLocales = $supportedLocales;
        $this->localeRouteParam = $localeRouteParam;
    }

    public function isLocaleSupported($locale) {
        return in_array($locale, $this->supportedLocales);
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        $locale = $request->get($this->localeRouteParam);

        if(null !== $locale) {
            $routeName = $request->get('_route');

            if(!$this->isLocaleSupported($locale)) {
                $routeParams = $request->get('_route_params');

                if (!$this->isLocaleSupported($this->defaultLocale))
                    throw \Exception("Default locale is not supported.");

                $routeParams[$this->localeRouteParam] = $this->defaultLocale;
                $url = $this->router->generate($routeName, $routeParams);

                $event->setResponse(new RedirectResponse($url));
            }
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

services.yml

services:
    selly_webapp_landing.listeners.localeInParam_listener:
        class: Selly\WebappLandingBundle\EventListener\LocaleInParamListener
        arguments: [@router, "%kernel.default_locale%", "%locale_supported%"]
        tags:
            - { name: kernel.event_subscriber }

parameters.ymlサポートされているロケールを指定できます。

locale_supported: ['en_US', 'pl_PL']
于 2014-05-28T08:51:07.630 に答える
1

従来の構成ローダー (Symfony\Component\Config\Loader\Loader) を拡張するカスタム ローダーが必要で、パターンを操作する必要があると思います

http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html

最初の例を確認してください。まだ試していませんが、問題に適合すると確信しています。

于 2013-07-12T08:22:02.047 に答える