Symfony路由包-删除URL: /en/→/en中区域设置的尾斜杠



我有以下设置:

  • Symfony 3.1
  • JMSTranslationBundle
  • JMSI18nRoutingBundle

一切正常。但是有一个小问题我不明白:

  • 路由被正确翻译,路由结束时不带尾斜杠:
    test.com/en/contact
  • 不幸的是, homepage 路由有一个尾斜杠:
    test.com/en/ 应为 test.com/en
  • test.comtest.com/en的调用也被重定向到test.com/en/

如何去掉这个尾斜杠?


这是我的配置:

我已经在parameters.yml:

中设置了区域设置
parameters:
    locale: de
    locales: [de, en]

我已经在config.yml:

中配置了JMS路由包
jms_i18n_routing:
    default_locale: "%locale%"
    locales: "%locales%"
    strategy: prefix

我的路由在routing.yml:

app:
    prefix: /
    resource: '@AppBundle/Controller/AppController.php'
    type: annotation
    options: { i18n: true }

我的索引/默认操作是这样注释的:

/**
 * @Route("/", name="homepage")
 */
public function indexAction(Request $request) {}

/web中的htaccess文件是Symfony 3.1附带的样板文件


我已经尝试删除注释(@Route("", name="homepage"))中的/,但没有任何运气

我认为这是由于相对url的工作方式,当使用:

<a href="{{ path('homepage') }}">Homepage<a>

生成的链接必须是"/",否则它将不起作用,它将转到相同的实际页面,而不是转到主页。

这是我的解决方案。首先,你必须将路由转换定义为空字符串。我正在使用yaml配置。

# AppBundle/Resources/config/routing.yml
homepage:
  path:     /
  defaults: { _controller: AppController:Page:index }
# AppBundle/Resources/translations/routes.de.yml
# AppBundle/Resources/translations/routes.en.yml
# and other routes translation files...
homepage: ''

现在末尾的斜杠被删除了,但是当我们尝试访问没有locale参数(www.mypage.com)的页面时,它首先被重定向到www.mypage.com/en/,然后重定向到www.mypage.com/en。

这是由JMSI18nRoutingBundleEventListenerLocaleChoosingListener引起的,onKernelException方法的最后一行:$event->setResponse(new RedirectResponse($request- >getBaseUrl().'/'.$locale.'/'.($params ? '?'.http_build_query($params) : '')));这部分更精确:'$locale' . '/' .

我们能做的是重写这个监听器。我是这样做的:

# AppBundle/Resources/config/services.yml
parameters:
  jms_i18n_routing.locale_choosing_listener.class: AppBundleEventListenerLocaleChoosingListener
# AppBundle/EventListener/LocaleChoosingListener
<?php
namespace AppBundleEventListener;
use JMSI18nRoutingBundleEventListenerLocaleChoosingListener as BaseListener;
use JMSI18nRoutingBundleRouterLocaleResolverInterface;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpKernelEventGetResponseForExceptionEvent;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
use SymfonyComponentHttpKernelHttpKernelInterface;
use SymfonyComponentRoutingExceptionResourceNotFoundException;
/**
 * Removing trailing slash from homepage requests
 * {@inheritdoc}
 */
class LocaleChoosingListener extends BaseListener
{
    private $defaultLocale;
    private $locales;
    private $localeResolver;
    public function __construct($defaultLocale, array $locales, LocaleResolverInterface $localeResolver)
    {
        parent::__construct($defaultLocale, $locales, $localeResolver);
        // If these properties were protected, we could remove the constructor.
        $this->defaultLocale = $defaultLocale;
        $this->locales = $locales;
        $this->localeResolver = $localeResolver;
    }
     public function onKernelException(GetResponseForExceptionEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }
        $request = $event->getRequest();
        if ('' !== rtrim($request->getPathInfo(), '/')) {
            return;
        }
        $ex = $event->getException();
        if (!$ex instanceof NotFoundHttpException || !$ex->getPrevious() instanceof ResourceNotFoundException) {
            return;
        }
        $locale = $this->localeResolver->resolveLocale($request, $this->locales) ?: $this->defaultLocale;
        $request->setLocale($locale);
        $params = $request->query->all();
        unset($params['hl']);
        $event->setResponse(new RedirectResponse($request->getBaseUrl().'/'.$locale.($params ? '?'.http_build_query($params) : '')));
    }
}

php bin/console debug:router

    ru__RG__main                   ANY      ANY      ANY    /                                  
    en__RG__main                   ANY      ANY      ANY    /en/                                
    ua__RG__main                   ANY      ANY      ANY    /ua/

创建翻译文件

routes.ru.yml
routes.en.yml
routes.ua.yml

添加了这个('main' -这是我的路由名)main: ''

    php bin/console debug:router
    
    ru__RG__main                   ANY      ANY      ANY    /                                  
    en__RG__main                   ANY      ANY      ANY    /en                              
    ua__RG__main                   ANY      ANY      ANY    /ua

最新更新