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);
这种方法的问题是,您必须在所有需要的函数中将语言环境作为参数传递。
在我使用 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);
这种方法的问题是,您必须在所有需要的函数中将语言环境作为参数传递。