如何建立工廠

當需要為類提供硬依賴時,最佳實踐是使用建構函式注入模式,其中使用工廠注入這些依賴項。

讓我們假設 MyClass 很難依賴於需要從應用程式配置中解析的值 $dependency

<?php
namespace Application\Folder;

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

class MyClass
{
    protected $dependency;

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

要注入此依賴項,將建立工廠類。這個工廠將解析配置中的依賴項並在構造類時注入配置值並返回結果:

<?php
namespace Application\Factory;

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

class MyClassFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    { 
        $config = $servicelocator->get('Config');
        $dependency = $config['dependency'];
        $myClass = new MyClass($dependency);
        return $myClass;
    }
}

現在已經建立了工廠類,它必須在關鍵工廠下的模組配置檔案 module.config.php 中的服務管理器配置中註冊。最好為類和工廠使用相同的名稱,以便在專案資料夾樹中輕鬆找到它們:

<?php

namespace Application;

return array(
    //...
    'service_manager' => [
        'factories' => [
            'Application\Folder\MyClass' => 'Application\Factory\MyClassFactory'
        ]
    ],
    //...
);

或者,類名常量可用於註冊它們:

<?php

namespace Application;

use Application\Folder\MyClass;
use Application\Factory\MyClassFactory;

return array(
    //...
    'service_manager' => [
        'factories' => [
            MyClass::class => MyClassFactory::class'
        ]
    ],
    //...
);

現在可以使用我們在為該類註冊工廠時使用的金鑰在服務管理器中收集類:

 $serviceManager->get('Application\Folder\MyClass');

要麼

 $serviceManager->get(MyClass::class);

服務管理器將查詢,收集並執行工廠,然後返回注入依賴項的類例項。