2016-09-22 9 views
3

私のsymfony2アプリケーションの構造は次のとおりです。依存性注入とモデルエンティティ - 正しい方法ですか?

さまざまな外部ソースからデータを取得し、それをエンティティオブジェクトとして表すサービスdata_providerがあります。

一部のオブジェクトにはリレーションがあります。現在、私は必要に応じてコントローラやヘルパーサービスの関係をロードしています。

非常に便利ではありませんが、ときどき私のエンティティojbectとの関係を得たいと思っています。これを行うには、data_providerサービスにアクセスする必要があります。

doctrine遅延ロードのようなものを実装したいのですが、これを行う正しい方法は何ですか?

いくつかの明白なソリューション - すべてのエンティティのinstacneで、またはいくつかの静的プロパティにdata_providerを注入する、またはサービスの一部の静的メソッドを作るために、またはevenetディスパッチャを使用するが、私はそれが正しい方法

だとは思いません
+1

ドクトリン2は、エンティティのメタデータへのアクセスを持っており、遅延ロードのようなもののために基本的に責任があるObjectManagerInterfaceを持っています。標準のDoctrine EntityManagerは、このインターフェイスを実装して、すべての魔法を実行します。私は、このインタフェースを実装するためにdata_providerを調整できるかもしれないと考えています。これはDoctrineの多くの機能にアクセスできるようにします。決してそれを試したことがないので、私はこれを行う方法について何か助けをすることはできません。しかし、それが大きなプロジェクトであれば、Doctrineの勇気を掘り起こす価値があるかもしれません。 – Cerad

+0

検索の指示をありがとうございます。 :) https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Persistence/PersistentObject.php このインターフェイスは「ObjectManagerAwareInterface」と呼ばれます。 ObjectManagerのインスタンスは、ObjectManagerの初期化中に基本オブジェクトクラスのprivate staticプロパティに設定されているようです。 – user2554865

答えて

0

CERADが提案されているようObjectManagerInterfaceのいくつかの研究を行い、このコードの平和を見つけた:PersistentObjectはObjectManagerAwareインタフェースを実装https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Persistence/PersistentObject.php

、それはの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のサービスの主な目的は、全く同じです。つまり、あなたのプロジェクトに特化した機能をグローバルに配信することです。

この点で、あなたのケースの1つのサービス(dataProvider)は、常に1つのエンティティを提供する必要があります。 1つのデータソースから返された複数のエンティティを処理する必要がある場合は、データソースデリバラをサービス自体にラップして、デリバラが挿入された各エンティティごとに1つのサービスを定義します。

次に、それぞれのエンティティサービスをコントローラに注入できます。

+0

私のdataProviderサービスは、いくつかのオブジェクトを作成するファクトリを返します。教義サービスについて考えると、それは同じように機能します。 'data_provider'はDataProviderのインスタンスを提供します.DataProviderはいくつかの外部リクエストを行い、オブジェクトのjsonオブジェクトやjson配列のようなデータを取得し、PHPクラスでラップします。 外部ソースからフェッチされたオブジェクトにはリレーションがあります。私はこの関連オブジェクトを怠惰にロードしたい。 – user2554865

+0

私が言ったように、 'data_provider'サービスを、あなたが持っているさまざまなデータ型と同じくらい多くのサービスに注入することができます。その後、これらのサービスをコントローラに使用します。 –

+0

あなたの 'data_provider'からコントローラーにどのような関係が必要ですか?あなたがそれを記述するとき、 'data_provider'は単なるファクトリーなので、inは不透明な関係しか持たないといけません。 –