2013-11-28 8 views
5

ZF2を使い始めたばかりで、本当に楽しんでいます。ZF2のZendレジストリに代わるもの

私が少し困惑するものは、レジストリコンポーネントがないことです。私はService Managerがほとんどの場合、レジストリを廃止するようにしていることに気付きました。私はそれを重く頼りにしています。

しかし、私は自分自身が「グローバル」オブジェクトにアクセスする必要があり、Service Managerにアクセスすることはできません。たとえば、私のDomain \ Userオブジェクトでは、Zend \ Logへのアクセスが必要です。

私のドメインオブジェクトでサービスマネージャを使用したくないのは、それらが美しくて素朴であり、そのような考慮事項によって純粋であるためです。必要に応じていつでもログインスタンスを '新しく'できましたが、頻繁に行うため、あらかじめ設定されたインスタンスを手に入れることをお勧めします。私はシングルトンでそれをラップすることができますが、それは後ろのステップのようです。私は自分自身のミニレジストリを作成することができましたが、それが良いアイデアなら、Zendの人たちがそのようなコンポーネントをそのまま残しておいたと確信しています。

他にどのようなオプションがありますか?

EDIT:

おそらく私はZend DIをおそらく使用できますか?私はこの質問が部分的にそれをカバーするのを見る。Configuring class alias for using with Zend\Di\Di

+4

「正しい」方法は、LogオブジェクトをDomain \ Userオブジェクトに依存関係として渡すことです。ロギングは、ドメインモデルでは通常行うことではありません。なぜこれが必要なのかをもう少し説明できますか? –

+0

こんにちはTim、変数のvar_dumpまたはprint_rを取得するために使用します。デバッグのためだけに、本当に。 –

+0

あなたの編集はいいと思う - Zend \ Di \ Diは、オブジェクト構築における依存関係をincectingする良い方法のようだ。しかし、あなたが言及したように、これは本当に依存しない(ロギングなど)場合にのみ行うべきです。 – P0rnflake

答えて

3

あなたは正確に依存性注入の問題に取り組んでいる。私は前にこのトピックについてブログに書いています。どのようにrefactor towards dependency injectionに行って、soft dependenciesがロガーのようなものなら何をすればいいですか?

あらかじめ設定されたロガーを注入することをお勧めします。 Domain \ Userオブジェクトが作成されると、ロガーが挿入されます。これにより、Domain \ Userオブジェクトは、ロガーの作成方法を知らなくてもロガーにのみ依存します。 Loggerインターフェースを利用する方が良いので、必要なロガーインプリメンテーションにスワップできます。

例として、私はあなたがZendの\ログを使用していると仮定。 Zend\Log\Loggerのようなロガーがあり、さまざまな作家が添付されています。ロガーはZend\Log\LoggerInterfaceを実装しています。

あなたのドメイン\ Userクラス:

namespace Domain; 

Zend\Log\LoggerInterface; 

class User 
{ 
    protected $logger; 

    public function __construct(LoggerInterface $logger) 
    { 
     $this->logger = $logger; 
    } 

    public function doSomething() 
    { 
     $this->logger->info('Do Something'); 

     // 
    } 
} 

は、Zend Frameworkのために、あなたのオブジェクトにこのロガーを注入する工場で動作するはずです。最善の方法は、ロガーを他のオブジェクトにも再利用できるため、ロガーをサービスとして定義することです。

注Zend \ DiではなくService Managerを使用します。 Zend \ Diは廃止され、より柔軟で速いZend \ ServiceManagerに置き換えられました。どちらも依存性注入を達成することができます。

あなたのための工場は、ロガー:次に

namespace MyModule\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

use Zend\Log\Logger; 

class LoggerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $logger = new Logger; 
     // do more with $logger here 

     return $logger; 
    } 
} 

あなたのためのサービス「ロガー」を作成するには、この工場を登録します。あなたのmodule.config.php:

'service_manager' => array(
    'factories' => array(
     'logger' => 'MyModule\Factory\LoggerFactory', 
    ), 
), 

loggerはサービスマネージャーで入手できます。あなたのドメインモデルについても同じことをしてください。最初の工場を作成します。次に

namespace MyModule\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

use Domain\User; 

class UserFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $logger = $serviceLocator->get('logger'); 

     $user = new User($logger); 
     return $user; 
    } 
} 

あまりにも、このいずれかを登録します。

'service_manager' => array(
    'factories' => array(
     'logger' => 'MyModule\Factory\LoggerFactory', 
     'Domain\User' => 'MyModule\Factory\UserFactory', 
    ), 
), 

を使用すると、サービスロケータへのアクセス権を持っている場合は、ドメイン\ユーザーを取得することができますし、ロガーを自動的に注入されています

$user = $sl->get('Domain\User');