Symfony 2 Service" app.locale_listener"必须实现接口。但它已实施

时间:2016-07-01 10:43:23

标签: php symfony listener invalidargumentexception

我正在使用Symfony2,我想为我的网站添加多语言支持。我有捆绑symfony / symfony。但是,当我按照the documentation所说的设置locale变量时。我得到以下error。我的班级看起来像

<?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)),
    );
}
}

和service.yml

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

如果您有任何建议如何解决这个问题,我很高兴听到它。

编辑: 我现在解决了这个问题,过了一段时间我注意到该类已经存在于vendor文件夹中的其他位置。那班人的工作和看起来与我的相同。所以我插入了我的代码并解决了它。

2 个答案:

答案 0 :(得分:0)

您不必使用听众来使用多语言。 您有翻译,您可以在路由上设置区域设置变量。 并设置默认值。

我的app / config / routing.yml中的示例

blog_bundle:
    resource: "@BlogBundle/Resources/config/routing.yml"
    prefix:   /{_locale}/blog
    requirements:
        _locale: fr|en|it|es
    defaults: { _locale: fr}

答案 1 :(得分:0)

看起来getSubscribedEvents的Method Signature与接口声明不同。

尝试切换     静态公共函数getSubscribedEvents() 至     public static function getSubscribedEvents()

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

关于Stans的回答: 如果您可以随时携带所有路线中的本地路线,这是正确的方法。只需将_locale添加到路由中,symfony就会自动在请求中设置它。 如果您不想在路线中使用它并根据cookie值或类似当前TLD的方式设置它,则订户方法是正确的。