我按照https://symfony.com/doc/current/setup.html的官方symfony文档中的“入门”部分,在symfony3中创建了一个新站点。
一切正常。.如果我将mydomain.com作为URL,则框架添加/ en或正确的本地。
我的问题是,是否存在一种方法,如果用户对mydomain.com/blog进行深层链接,框架会发现本地不存在,因此可以将URL添加并将其转换为mydomain.com/en/blog < / p>
我没有添加代码,因为它是默认代码。让我知道您是否需要它。
答案 0 :(得分:1)
有多种方法可以做到这一点。可能最简单的方法是让一个EventSubscriber或-Listener捕获没有语言环境的请求,然后处理添加该信息。由于您的项目基于演示应用程序,因此您可能需要查看其解决方案:https://github.com/symfony/demo/blob/master/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php
在事件处理程序中执行的步骤大致如下:
kernel.request
事件答案 1 :(得分:1)
感谢@dbrumann,我得到了这个解决方案...可以肯定的是,使用更少的代码可以改进它,但是它确实起到了作用。
我在RedirectToPreferredLocaleSubscriber类中更新了onKernelRequest方法
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);
}
}
}
}