Сервис Symfony 2 "app.locale_listener" должен реализовывать интерфейс. но это реализовано

Я использую Symfony2, и я хотел добавить поддержку мультиязычности на моем сайте. У меня есть пакет Symfony / Symfony. Тем не менее, когда я делаю, как сказано в документации, для установки переменной локали. Я получаю следующую ошибку. мой класс выглядит

<?php
// src/AppBundle/EventListener/LocaleListener.php
namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;

public function __construct($defaultLocale = 'en')
{
    $this->defaultLocale = $defaultLocale;
}

public function onKernelRequest(GetResponseEvent $event)
{
    $request = $event->getRequest();
    if (!$request->hasPreviousSession()) {
        return;
    }

    if ($locale = $request->attributes->get('_locale')) {
        $request->getSession()->set('_locale', $locale);
    } else {
        $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
    }
}

static public function getSubscribedEvents()
{
    return array(
        // must be registered before the default Locale listener
        KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
    );
}
}

и сервис.имл

 app.locale_listener:
        class: AppBundle\EventListener\LocaleListener
        arguments: ['%kernel.default_locale%']
        tags:
            - { name: kernel.event_subscriber }`

если у кого-нибудь из вас есть предложение, как решить эту проблему, я был бы рад услышать это.

РЕДАКТИРОВАТЬ: я теперь исправил проблему, я заметил через некоторое время, что класс уже существует где-то еще в папке поставщика. Этот класс работал и выглядел идентично моему. Поэтому я вставил свой код, и это решило его.

2 ответа

Похоже, что Signature метода ваших getSubscribeedEvents не идентична объявлению интерфейса.

Попробуйте переключить статическую публичную функцию getSubscribeedEvents() на публичную статическую функцию getSubscribeedEvents()

public static function getSubscribedEvents()
{
    return array(
        // must be registered before the default Locale listener
        KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
    );
}

Отредактируйте в отношении ответа Стэнса: если это нормально, вы всегда должны нести местный во всех ваших маршрутах, что является правильным способом. Просто добавьте _locale к маршруту, и Symfony автоматически установит его в запросе. Если вы не хотите использовать его в своих маршрутах и ​​установить его на основе значения файла cookie или чего-то подобного вашему текущему TLD, метод подписчика будет правильным.

Вам не нужно использовать слушателя, чтобы использовать многоязычность. У вас есть переводы, вы можете установить переменную локали на маршрутизации. И установить значение по умолчанию.

Пример в моем app / config / routing.yml:

blog_bundle:
    resource: "@BlogBundle/Resources/config/routing.yml"
    prefix:   /{_locale}/blog
    requirements:
        _locale: fr|en|it|es
    defaults: { _locale: fr}
Другие вопросы по тегам