Php 依赖注入和模型实体-正确的方法?

Php 依赖注入和模型实体-正确的方法?,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,我的symfony2应用程序具有以下结构: 有一个服务数据\u提供者,它从各种外部源获取数据,并将其表示为实体对象 有些对象有关系。目前,如果需要,我正在控制器或助手服务中加载关系 这不是很方便,有时我想从我的实体ojbect获得关系。为此,我需要访问数据\u提供者服务 我想实现一些类似于延迟加载的方法,正确的方法是什么 一些显而易见的解决方案-在每个实体instacne中注入数据\u提供者,或者注入一些静态属性,或者在服务中创建一些静态方法,或者使用evenet dispatcher,但我认为

我的symfony2应用程序具有以下结构:

有一个服务
数据\u提供者
,它从各种外部源获取数据,并将其表示为实体对象

有些对象有关系。目前,如果需要,我正在控制器或助手服务中加载关系

这不是很方便,有时我想从我的实体ojbect获得关系。为此,我需要访问
数据\u提供者
服务

我想实现一些类似于延迟加载的方法,正确的方法是什么


一些显而易见的解决方案-在每个实体instacne中注入
数据\u提供者
,或者注入一些静态属性,或者在服务中创建一些静态方法,或者使用evenet dispatcher,但我认为这不是Symfony服务的主要目的(不仅仅是)的正确方法正是这一点-在全球范围内为您的项目提供卓越的功能

在这方面,单个服务(在您的情况下是dataProvider)应该始终提供单个实体。如果必须处理从一个数据源返回的多个实体,请将数据源交付者包装到服务本身中,然后为每个实体定义一个服务,并将交付者注入其中


然后,您可以将相应的实体服务注入控制器。

按照Cerad的建议对ObjectManagerInterface进行了一些研究,并发现了这种代码的和平性:

PersistentObject实现ObjectManagerWare接口,它具有存储ObjectManager的私有静态属性

所以我以这个结尾:

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

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

我的dataProvider服务返回一个工厂,它创建一些对象。想想条令服务,它的工作原理是一样的
data\u provider
提供DataProvider的实例,该实例发出一些外部请求,获取一些数据,如json对象或对象的json数组,并将其包装在php类中。从外部源获取的某些对象具有关系。我想延迟加载这些相关对象。因此,正如我所说的,您可以将
数据\u提供者
服务注入到尽可能多的服务中,就像您拥有的不同数据类型一样。然后在控制器中使用这些服务。您需要从您的
数据\u提供者
到控制器中的具体关系是什么?正如您所描述的,
data\u provider
只是一个工厂,因此,in必须只有不透明的关系。例如:我向
data\u provider
发出请求以获取汽车列表。它返回1000个Car类对象。Car有一些特别优惠,可以从
数据\u提供商
处获得。我只想得到399车的特价,而不是所有车的特价。我想从汽车上得到它,我会用两种方法,视情况而定:1。如果“所有车辆”和“特定车辆信息”的数据传递者是同一个,则将所有内容保存在
数据提供程序中
,并将其实施到两个单独的方法中。2.如果数据交付者不同,则将两者拆分为2个不同的服务。然后,再次向控制器中注入任何需要的东西。原则2有一个ObjectManagerInterface,它可以访问您的实体元数据,基本上负责延迟加载之类的事情。标准条令EntityManager实现了这个接口来完成它的所有功能。我认为您可能能够调整您的数据提供者以实现该接口,从而使您能够访问大量的条令功能。我自己从来没有试过,所以我无法提供任何帮助。但是,如果这是一个大项目,那么它可能值得深入挖掘教义的精髓。感谢您提供搜索方向。:)该接口称为
ObjectManagerWareInterface
。在ObjectManager的初始化过程中,ObjectManager的实例似乎是在基本对象类的私有静态属性中设置的。