在我的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;
}
}
感谢所有
答案 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声明