あなたは正確に依存性注入の問題に取り組んでいる。私は前にこのトピックについてブログに書いています。どのように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');
「正しい」方法は、LogオブジェクトをDomain \ Userオブジェクトに依存関係として渡すことです。ロギングは、ドメインモデルでは通常行うことではありません。なぜこれが必要なのかをもう少し説明できますか? –
こんにちはTim、変数のvar_dumpまたはprint_rを取得するために使用します。デバッグのためだけに、本当に。 –
あなたの編集はいいと思う - Zend \ Di \ Diは、オブジェクト構築における依存関係をincectingする良い方法のようだ。しかし、あなたが言及したように、これは本当に依存しない(ロギングなど)場合にのみ行うべきです。 – P0rnflake