[英]Alternatives to Zend Registry for ZF2
我剛開始使用ZF2,我真的非常喜歡它。
令我困惑的一件事是沒有注冊表組件。 我意識到服務管理器在大多數情況下使注冊表過時。 我非常依賴它而且很棒。
但有時我發現自己需要訪問“全局”對象,而我無法訪問服務管理器。 例如,在我的Domain \\ User對象中,我需要訪問Zend \\ Log。
我不希望在我的Domain對象中提供Service Manager,因為它們非常漂亮和原始,並且沒有因這些考慮因素而受到影響。 我可以在需要時“新建”一個日志實例,但是我經常這么做,我寧願預先配置一個實例。 我可以把它包裝成單身,但這似乎是一個倒退的步驟。 我可以創建自己的迷你注冊表,但如果這是一個好主意,我相信Zend家伙會留下這樣的組件。
那么,還有哪些其他選擇?
編輯:
那么,我可以使用Zend DI嗎? 我看到這個問題部分涵蓋了它, 使用Zend \\ Di \\ Di配置類別名
您正在解決依賴注入的問題。 我之前有關於這個主題的博客,如何重構依賴注入,以及如果你有像Logger這樣的軟依賴 ,該怎么辦。
我們的想法是注入預先配置的記錄器。 創建Domain \\ User對象時,將注入記錄器。 這使得Domain \\ User對象僅依賴於記錄器而不知道如何創建記錄器。 如果您依賴Logger接口,它會更好,因此您可以交換到您想要的任何記錄器實現。
例
例如,我假設您使用的是Zend \\ Log。 你有一個像Zend\\Log\\Logger
,附帶了各種編寫器。 記錄器實現Zend\\Log\\LoggerInterface
。
您的域\\用戶類:
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,您應該與工廠一起將此記錄器注入對象。 最好的方法是首先將Logger定義為服務,因為您也可以將記錄器重用於其他對象。
注意我在這里使用服務管理器而不是Zend \\ Di. 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',
),
),
如果您有權訪問服務定位器,則可以獲取Domain \\ User並自動注入記錄器:
$user = $sl->get('Domain\User');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.