2015-07-04 4 views
0

Мне нужно установить параметр в некоторые запросы, которые поступают из конфигурации symfony2.symfony2 doctrine2 параметр параметра запроса из config

Обычно вы должны передавать этот параметр извне класса репозитория, но в этом случае я не хочу этого делать.

Я просмотрел пользовательскую функцию (как это уже происходит в игре), но я не могу использовать службу как пользовательскую функцию для Doctrine. Поэтому мне нужно будет сделать некоторые неприятные вещи, чтобы получить параметр из ServiceContainer. Нечто похожее на SqlWalkers.

Я думаю, что лучше всего даже нажать на параметр в объект конфигурации Doctrine или EntityManager. Это позволит мне получить параметр из объекта Query в CustomFunction и добавить его к запросу, когда это необходимо.

Если это невозможно, хорошей альтернативой может быть наличие параметра в классе репозитория. Таким образом, это не нужно передавать вручную в класс репозитория.

Есть ли способ вставить какой-либо пользовательский параметр в конфигурацию Doctrine? Или класс репозитория? У кого-нибудь есть лучшее решение?

+0

Не могли бы вы объяснить, что мешает вам вводить параметр в репозиторий (услугу)? – nifr

+0

Просто для простоты, можете ли вы рассказать нам, чего хотите, вместо того, чтобы писать длинный случай? Спасибо – BentCoder

+1

Вы хотели что-то противное, так что это (хорошо на основе того, что я понял после попытки понять): http://stackoverflow.com/questions/12971552/symfony2-how-to-access-to-service-from-repository – BentCoder

ответ

0

Ненавижу отвечать на свои вопросы, но решение, которое я нашел, отличается от того, что было предложено и работает как шарм.

Краткая версия: Украсьте диспетчер объектов и настройте класс репозитория перед его возвратом.

Длинная версия: Создание декоратора:

class EntityManagerDecorator extends \Doctrine\ORM\Decorator\EntityManagerDecorator 
{ 
    protected $myProperty; 

    public function __construct(EntityManagerInterface $wrapped, ....) { 
     parent::__construct($wrapped); 
     $this->myProperty = $myProperty; 
    } 

    // overridden method so we can add some additional logic. 
    public function getRepository($className) 
    { 
     $repository = parent::getRepository($className); 

     if ($repository instanceof ExpandedEntityRepository) { 
      $repository->setMyProperty($this->myProperty); 
     } 
     return $repository; 
    } 
} 

Создать новый класс Base-хранилище, убедитесь, что вы расширить свои хранилища классов, которые нуждаются в этом от этого.

class ExpandedEntityRepository extends EntityRepository { 
    protected $myProperty; 
    public function getMyProperty() 
    { 
     return $this->myProperty; 
    } 
    public function setMyProperty($myProperty) 
    { 
     $this->myProperty = $myProperty; 
    } 
} 

Я рекомендую вам на самом деле заменить это с интерфейсом (который вы проверить для в Decorator) и черта (которым вы добавляете в свой репозиторий класса, чтобы добавить необходимые методы), чтобы сделать его более элегантным. Я использовал базовый класс, как это все еще нужно работать в PHP5.3

Наконец настроить для украшения служб по оригинальный менеджер сущности:

services: 
    my_cool_bundle_entitymanager_decorator: 
     public: false 
     class: MyCoolBundle\ORM\EntityManagerDecorator 
     decorates: doctrine.orm.default_entity_manager 
     arguments: 
      - @my_cool_bundle_entitymanager_decorator.inner 
      - %my_cool_bundle.property% 

Имейте в виду, что вам может понадобиться, чтобы сделать это несколько если у вас есть дополнительные лица-менеджеры.

0

Что такое репозиторий? Это не более чем результат шаблона фабрики в классе Doctrine Manager.

Таким образом, вы можете определить свой репозиторий как службу в контейнере. Эта услуга является результатом фабричного вызова:

http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/

http://symfony.com/doc/current/components/dependency_injection/factories.html

Вы можете вводить параметры конфигурации с помощью вызовов.

+0

Вы совершенно правы в том, что репозиторий - это еще одна услуга. Это будет хорошо работать. Для этого требуется каждый репозиторий, для которого это необходимо для определения как отдельной службы. И вам нужно получить репозиторий как службу, его нельзя вытащить из самой Доктрины с дополнительными параметрами. Я бы предпочел, чтобы решение всегда срабатывало. – DoppyNL

Смежные вопросы