2016-09-22 2 views
3

Мое приложение symfony2 имеет следующую структуру:Впрыскивание зависимостей и объекты модели - правильный путь?

Существует служба data_provider, которая получает данные из разных внешних источников и представляет ее как объекты сущности.

Некоторые объекты имеют отношения. В настоящее время я загружаю отношения в контроллер или вспомогательные службы, если это необходимо.

Это не очень удобно, иногда я хочу получить отношения с моей сущностью ojbect. Для этого мне нужен доступ к услуге data_provider.

Я хочу реализовать что-то вроде доктрины ленивой загрузки, каков правильный способ сделать это?

некоторых очевидных решений - для инъекционных data_provider в каждой сущности instacne, или в какое-то статическое свойство, или сделать некоторые статические методы в эксплуатации, или использовать evenet диспетчер, но я не думаю, что это правильный путь

+1

Doctrine 2 имеет ObjectManagerInterface, который имеет доступ к данным мета-сущностей и в основном отвечает за такие вещи, как отложенной загрузки. Стандартная Doctrine EntityManager реализует этот интерфейс, чтобы сделать все это волшебство. Я полагаю, что вы могли бы настроить ваш data_provider для реализации этого интерфейса, а это, в свою очередь, даст вам доступ к большому количеству функций Doctrine. Никогда не пробовал это сам, поэтому я не могу предложить какую-либо помощь в том, как это сделать. Но если это большой проект, то, возможно, стоит впасть в мужество доктрины. – Cerad

+0

Благодарим вас за направление поиска. :) https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Persistence/PersistentObject.php Интерфейс называется 'ObjectManagerAwareInterface'. Кажется, что экземпляр ObjectManager установлен в приватном статическом свойстве класса базового объекта во время инициализации ObjectManager. – user2554865

ответ

0

Сделаны некоторые исследования ObjectManagerInterface как это было предложена Cerad, и нашел этот мир коды: https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Persistence/PersistentObject.php

PersistentObject реализует интерфейс ObjectManagerAware, он имеет частное статическое свойство, где ObjectManager хранятся.

Так я закончил с этим:

class DataProvider 
{ 
    public function __construct() 
    { 
     ... 
     AbstractEntity::setDataProvider($this); 
    } 
} 

abstract class AbstractEntity 
{ 
    private static $dataProvider; 
    public static function setDataProvider() {...}; 
    protected static function getDataProvider() {...}; 
} 
-1

Основная цель услуг в Symfony (и не только) заключается именно в том, чтобы предоставить отличные функциональные возможности глобально над вашим проектом.

В этой связи одна служба, в вашем случае - dataProvider, должна всегда предоставлять единый объект. Если вам приходится иметь дело с несколькими объектами, возвращаемыми из одного источника данных, оберните передатчик источника данных в саму службу и затем определите одну услугу на каждый объект с введенным в нее поставщиком доставки.

Затем вы можете внедрить соответствующие службы сущности в свои контроллеры.

+0

My dataProvider service возвращает фабрику, которая создает некоторые объекты. Подумайте о службе доктрины, она работает одинаково. 'data_provider' предоставляет экземпляр DataProvider, который делает некоторый внешний запрос, получает некоторые данные, такие как объект json или массив json объектов и обертывает его в php-классы. Некоторые объекты, извлеченные из внешних источников, имеют отношения. Я хочу ленить загружать связанные объекты. – user2554865

+0

Итак, как я уже сказал, вы можете ввести свой сервис 'data_provider' в такое же количество сервисов, как и у разных типов данных.Затем используйте эти службы в контроллерах. –

+0

Какое отношение вам нужно от вашего 'data_provider' в контроллер? Как вы его описываете, 'data_provider' - это просто фабрика, и поэтому она должна иметь только непрозрачные отношения. –

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