首页 > 解决方案 > Symfony 更改应用程序区域设置未在主页显示正确的链接

问题描述

我正在尝试将项目翻译成英语,我已将所有路线注释更改为多种语言样式:

我正在使用 symfony 4.2

/**
     * @Route({
     *     "nl": "/",
     *     "en": "/en"
     * })
     */
    public function indexAction(Request $request)

这是我的示例的链接:

<a class="customerservice" href="{{ path('web_page') }}">
  <i class="fal fa-headset" aria-hidden="true"></i> Klantenservice
</a>

这是链接所在的控制器:

 /**
     * @Route({
     *     "nl": "/klantenservice{slug}",
     *     "en": "/en/customer-service{slug}"
     * }, name="web_page", requirements={"slug": ".+"})
     */
    public function pageAction($slug = '/')
    {
        /** @var WebPageRepository $repository */
        $repository = $this->getDoctrine()->getRepository(WebPage::class);

        if (!$webPage = $repository->findOneBy(['slug' => $slug])) {
            return $this->redirectToRoute("web_page");
        }

        return $this->render('@FrontOffice/WebPage/page.html.twig', [
            'page' => $webPage,
            'pages' => $repository->getAllForMenu()
        ]);
    }

如果需要,我会分享我的 localeListner:

<?php

namespace FrontOfficeBundle\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class LocaleListener implements EventSubscriberInterface
{
    public function onKernelRequest(RequestEvent $event)
    {
        $request = $event->getRequest();

        if (!$request->hasPreviousSession()) return;

        if ( $locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);

            return;
        }

        $lang = explode('.', $request->getHost());
        if (!isset($lang[2]) || !$lang[2]) return;
        $request->setLocale($lang[2] == 'be' ? 'nl_BE' : $lang[2]);
    }

    public static function getSubscribedEvents()
    {
        return [
            // must be registered after the default Locale listener
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
        ];
    }
}

参数.yaml:

parameters:
  locale: nl
  default_date_format: "eee dd-MM-y HH:mm"
  product_upload_directory: "%var_path%/upload/"

services:
  _defaults:
    public: true
    autowire: true
    bind:
      $buckarooTestMode:    '%buckaroo_test_mode%'
      $buckarooCertificate: '%buckaroo_certificate%'
      $buckarooWebsiteKey:  '%buckaroo_website_key%'

路线.yaml:

set_session:
  path: '/_session'
  defaults: { _controller: FrontOfficeBundle\Controller\SessionController::setSessionAction }

plein_search_categories:
  path:     /zoeken/categorieen/{searchTerm}
  defaults: { _controller: FrontOfficeBundle\Controller\CategorySearchController::indexAction, searchTerm: null }

plein_search:
  path:     /zoeken/{searchTerm}
  defaults: { _controller: FrontOfficeBundle\Controller\SearchController::indexAction, searchTerm: null }

plein_search_index:
  path:     /zoeken/
  defaults: { _controller: FrontOfficeBundle\Controller\SearchController::indexAction, searchTerm: null }

plein_catalog_autocomplete:
  path:     /catalog/autocomplete
  defaults: { _controller: FrontOfficeBundle\Controller\AutocompleteController::indexAction }

homepage:
  path:
    nl: /
    en: /en
  controller: FrontOfficeBundle\Controller\DefaultController::indexAction

backOfficeRouting:
  resource: "@BackOfficeBundle/Controller"
  type:     annotation
  prefix:   /intranet
  condition: "%intranet% === 1"

esbClientRouting:
  resource: "@PleinEsbClientBundle/Controller"
  type:     annotation

fos_js_routing:
  resource: "@FOSJsRoutingBundle/Resources/config/routing/routing-sf4.xml"

core_routing:
  resource: "@PleinCoreBundle/Resources/config/routing.yml"
  prefix:   /

plein_brand:
  defaults:
    _controller: FrontOfficeBundle\Controller\BrandController::indexAction
  path: '/merken/'

plein_brand_router:
  defaults:
    _controller: FrontOfficeBundle\Controller\BrandController::brandAction
  path: '/merken/{slug}/'

plein_review_router:
  defaults:
    _controller: FrontOfficeBundle\Controller\ReviewController::writeAction
  path: '/review/schrijven/{product}/'

plein_review_list:
  defaults:
    _controller: FrontOfficeBundle\Controller\ReviewController::listAction
  path: '/reviews/{product}/'

plein_promotion_router:
  defaults:
    _controller: FrontOfficeBundle\Controller\CategoryController::promotionsAction
  path: '/aanbiedingen/'

themesRouting:
  resource: "@FrontOfficeBundle/Controller"
  type:     annotation

_liip_imagine:
  resource: "@LiipImagineBundle/Resources/config/routing.yaml"

frontOfficeRouting:
  resource: "@FrontOfficeBundle/Controller"
  type:     annotation

除主页外的所有页面都可以正常工作,例如当我在个人资料(英语语言环境)时:

http://domain-name.com/en/profile

在此处输入图像描述

当我悬停此链接时,它显示:http ://domain-name.com/en/customer-service

但!!!当我在主页时(英语语言环境):

http://domain-name.com/en

当我悬停相同的链接时,它显示:http ://domain-name.com/klantservice

因此,在两个不同页面上的相同区域设置,但在除主页之外的所有其他页面中,应用程序显示具有正确区域设置的所有链接。在主页上,它始终显示默认值。有什么小费吗?

标签: phpsymfony

解决方案


推荐阅读