我有以下设置:
- Symfony 3.1
- JMSTranslationBundle
- JMSI18nRoutingBundle
一切正常。但是有一个小问题我不明白:
- 路由被正确翻译,路由结束时不带尾斜杠:
test.com/en/contact
-
不幸的是,
homepage
路由有一个尾斜杠:test.com/en/
应为test.com/en
对
test.com
或test.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