Symfony3在deeplink中添加区域设置
我在symfony官方文档中的入门部分之后,在symfony 3中创建了一个新站点 一切正常。。如果我将mydomain.com作为URL,框架将添加/en或正确的本地地址 我的问题是,如果用户对mydomain.com/blog进行深度链接,框架是否会发现本地文件不存在,从而可以添加url并将其转换为mydomain.com/en/blogSymfony3在deeplink中添加区域设置,symfony,locale,symfony-3.4,Symfony,Locale,Symfony 3.4,我在symfony官方文档中的入门部分之后,在symfony 3中创建了一个新站点 一切正常。。如果我将mydomain.com作为URL,框架将添加/en或正确的本地地址 我的问题是,如果用户对mydomain.com/blog进行深度链接,框架是否会发现本地文件不存在,从而可以添加url并将其转换为mydomain.com/en/blog 我没有添加代码,因为它是默认代码。如果您需要,请告诉我。有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener
我没有添加代码,因为它是默认代码。如果您需要,请告诉我。有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener捕获请求而不使用区域设置,然后处理添加该信息的操作。由于您的项目基于演示应用程序,您可能希望了解他们的解决方案: 在事件处理程序中执行的步骤大致如下:
内核。请求事件
有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener捕获请求而不使用区域设置,然后处理添加该信息的操作。由于您的项目基于演示应用程序,您可能希望了解他们的解决方案: 在事件处理程序中执行的步骤大致如下:
内核。请求事件
多亏了@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);
}
}
}
}
多亏了@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);
}
}
}
}
谢谢你的帮助为我指出了解决办法!(我在下面贴了)感谢您发布修改后的解决方案。这将有助于任何人发现问题需要一个更具体的例子。谢谢!你的帮助为我指出了解决办法!(我在下面贴了)感谢您发布修改后的解决方案。这将有助于任何人找到需要更具体例子的问题。