簡體   English   中英

Zend Registry for ZF2的替代品

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM