2017-07-17 11 views
1

dbインスタンスのロギングと呼び出しに静的メソッドが使用されているSOAPサービスをリファクタリングしています。それはフレームワークではなく、カスタム作成のコードです。Symfony DI Service Containerの使い方は?

Db->getInstance()->prepare("some pepared statement"); 

とロガーは静的メソッド正常です::

Logger::log("Some log massage!"); 

私はすべてのことを変更したいと私は、これらの2つのサービスをsymfonyのサービスコンテナを実装し、登録された:それは、オブジェクトの呼び出しを持っているので、Dbがシングルトンである

$container->register('Logger', 'Helpers\LogHelpers\LogManager'); 
    $container->register('Db', 'Helpers\ConfigHelpers\Db'); 

私はこれらのサービスをプロジェクトのすべてのクラスに注入すべきでしょうか、あるいはいくつかのグローバル変数からこれらのサービスを使用する方法はありますか?私はコンテナから静的にサービスを呼び出すことができますが、コンテナを作るのはどういうことでしょうか?私はどこにでも注射するのが非常に複雑に思えるので、これを頼んでいます。もう1つの方法は、すべてのクラスを次のようなLoggerとDbの依存関係を持つサービスとして登録することです:

 $container->register('SKSPartner', 'Partners\SKSPartner')->setArguments([ 
     new Reference('SKSSoapClient'), 
     new Reference('Db'), 
     new Reference('Logger'), 
     new Reference('ServerManager') 
    ]); 
    $container->register('ThirdPartyIntegrationPartner', 'Partners\ThirdPartyIntegrationPartner')->setArguments([ 
     new Reference('ThirdPartyIntegrationSoapClient'), 
     new Reference('Db'), 
     new Reference('Logger'), 
     new Reference('ServerManager') 
    ]); 

これらの大きなクラスをサービスとして使用することです。しかし、プロジェクトのすべての部分がサービスになります。私がサービスコンテナで理解しているように、LoggerとDbとして何度も何度も使用されるクラス/サービスだけが登録されるべきですか?ここで何か助けていただければ幸いです。

+0

再利用可能なサービスのみを定義する必要があるという理解は正しくありません。理想的には、サービスのすべてのユーザーもサービスになります。受け入れられた答えに示唆されているように、あなたが正しい理由でそれらを使用することを確認する代わりに、別のアプローチがあります。 – Cerad

+0

@Cerad私は、再利用可能なサービス(DbとLogger)だけでアプローチを試みました。正直なところ、何かが正しく感じられません。私はあまりにも多くの場所にサービスを注入しなければならなかった。私は今すべてをサービスにしようとし、DbとLoggerは(上記の2番目の例のように)コンテナ自体に定義される依存関係になります。ありがとう! – belijja

答えて

0

どこにでも注射されているのですが、どこでも行かなければならないという面倒を理解しています。調べようとしましたSymfony service Autowiring?になる可能性があります。

あなたが必要に応じてサービスを引き出すことができるいくつかのグローバル変数を持つもう1つのアプローチは、基本的にコンテナですがグローバルです。しかし、問題は、DIパターンでは、注入する(そしてグローバルを使用することはあまりありません)ということです。依存関係の参照サイクルが非常に簡単に作成されるためにコンテナを注入することができないため、コンテナを注入すると、モックテストを正しく作成できないためグローバルコンテナになります。

これはちょっと役立つと思っています...

+0

基本的に私は自動配線を使用するか、LoggerとDbをすべてのクラスに注入しようとするべきです。 Db、Loggerおよび他のすべての依存関係を持つすべてのクラスをサービスとして登録するアプローチは間違っています。また、コンテナをグローバルにする唯一の方法は、コンテナがあるはずの静的メソッドであり、間違っていて、静的メソッドを使用してプロジェクトの最初のバージョンと同様にLoggerとDbをフェッチすることから変更はありません。私は最初にそれがどのように動作するかを見るために自動配線を実装しようとします。ありがとう、私は今作業する何かを持っている! – belijja

関連する問題