Symfony2, получите локаль в классе репозитория

В моем проекте с 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

Решение

Если вам нужно использовать локаль в запросе, вы можете попытаться получить локаль в контроллере, а затем использовать ее как параметр в функции репозитория:

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

Проблема с этим подходом заключается в том, что вам придется передавать локаль в качестве параметра во всех функциях, где она вам понадобится.

2

Другие решения

Это не очень хороший способ попытаться внедрить зависимость запроса / сессии в ваш репозиторий. Это создаст для вас дополнительные проблемы, например, если вам понадобится использовать репозиторий в консоли.

Вы можете взглянуть на переводимое расширение https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md

Также возможен способ создания собственного слушателя http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html и слушатель выберет правильную локаль из сессии и вставит ее в репозиторий, но, как я уже говорил, расширение Doctrine Transurable может сделать все для вас уже

2

Вы должны создать прослушиватель событий:

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

-1
По вопросам рекламы [email protected]