Symfony2,在存储库 class 中获取语言环境

Symfony2, get locale in repository class

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

在存储库中 class 我试过这个:

$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
}

编辑

我的仓库class:

<?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;

    }
}

感谢大家

尝试将 request/session 的依赖项注入您的存储库并不是一个好方法。如果您需要在控制台命令中使用存储库,这会给您带来额外的麻烦。

你可以看看 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 扩展已经可以为您完成所有工作

您必须创建事件侦听器:

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 }

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

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 声明中

如果您需要在查询中使用语言环境,您可以尝试在控制器中获取语言环境,然后将其用作存储库函数中的参数:

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

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