Symfony2,获取存储库类中的语言环境

时间:2015-04-30 14:40:10

标签: php symfony repository locale

在我的symfony2(2.0)项目中,我有一个包含所有查询的存储库类。 但是在这个查询中我需要语言环境(来自会话?)但是在存储库中我无法得到这个变量(在控制器中我没有任何问题)

在存储库类中我尝试了这个:

$request = $this->get('request');
$this->get('translator')->getLocale();

但对我不起作用......任何想法?

问题..... symfony 2.0 ......

编辑2

我的techn_note声明:

<?php

namespace EVTS\FrontendBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * EVTS\FrontendBundle\Entity\Tech_note
 *
 * @ORM\Table(name="tech_note")
 * @ORM\Entity
 * @ORM\Entity(repositoryClass="EVTS\FrontendBundle\Entity\TechNoteRepository")
 */
class Tech_note {
// fields here
}

修改

我的存储库类:

<?php

namespace EVTS\FrontendBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityRepository;

class TechNoteRepository extends EntityRepository {

    public function findNtecById($ntec_id) {
//        var_dump($request = $this->get('request'));
//        var_dump($this->get('translator')->getLocale());
//        var_dump($request->getLocale());

        echo "test";
        die;

    }
}

感谢所有

3 个答案:

答案 0 :(得分:2)

尝试将请求/会话的依赖项注入存储库并不是一种好方法。如果您需要在控制台命令中使用存储库,它将为您带来额外的麻烦。

您可以查看Translatable extension https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md

另一种可能的方法是创建自己的监听器http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html,监听器将从会话中获取正确的语言环境并将其注入存储库,但正如我已经告诉Doctrine Translatable扩展可以为您做的一切

答案 1 :(得分:2)

如果需要在查询中使用区域设置,可以尝试在控制器中获取区域设置,然后将其用作存储库功能中的参数:

$locale = $this->get('request')->getLocale();
$result = $this->getDoctrine()->getRepository('AcmeMyBundle:MyEntity')->findNtecByIdAndLocaleOrSomething($id, $locale);

这种方法存在的问题是,您必须将语言环境作为参数传递给您需要它的所有函数。

答案 2 :(得分:-1)

您必须创建一个事件监听器:

namespace EVTS\FrontendBundle\EventListener;


use Symfony\Component\HttpKernel\Event\GetResponseEvent;


class LocaleListener
{
    protected $locale;

    public function onKernelRequest(GetResponseEvent $event)
    {
        $this->locale = $event->getRequest()->getLocale();
    }

    public function getLocale()
    {
        return $this->locale;
    }
}

然后声明:

#config.yml
services:
    my_listener.locale:
        class:   EVTS\FrontendBundle\EventListener\LocaleListener
        tags:
            - {name: kernel.event_listener, event: kernel.request,  method: onKernelRequest }

现在将它添加到您的存储库类构造函数中:

namespace EVTS\FrontendBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping\ClassMetadata;

class TechNoteRepository extends EntityRepository {

    protected $locale;


    public function __construct($em, ClassMetadata $class, $localeListener)
    {
        parent::__construct($em, $class);

        $this->locale = $localeListener->getLocale();
    }

    public function findNtecById($ntec_id) {
//        var_dump($request = $this->get('request'));
//        var_dump($this->get('translator')->getLocale());
//        var_dump($request->getLocale());

        echo "test";
        die;

    }
}

最后,将其添加到您的EntityRepository声明