В моем проекте с 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;
}
}
Спасибо всем
Если вам нужно использовать локаль в запросе, вы можете попытаться получить локаль в контроллере, а затем использовать ее как параметр в функции репозитория:
$locale = $this->get('request')->getLocale();
$result = $this->getDoctrine()->getRepository('AcmeMyBundle:MyEntity')->findNtecByIdAndLocaleOrSomething($id, $locale);
Проблема с этим подходом заключается в том, что вам придется передавать локаль в качестве параметра во всех функциях, где она вам понадобится.
Это не очень хороший способ попытаться внедрить зависимость запроса / сессии в ваш репозиторий. Это создаст для вас дополнительные проблемы, например, если вам понадобится использовать репозиторий в консоли.
Вы можете взглянуть на переводимое расширение https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md
Также возможен способ создания собственного слушателя http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html и слушатель выберет правильную локаль из сессии и вставит ее в репозиторий, но, как я уже говорил, расширение Doctrine Transurable может сделать все для вас уже
Вы должны создать прослушиватель событий:
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