如何创建工厂

当需要为类提供硬依赖时,最佳实践是使用构造函数注入模式,其中使用工厂注入这些依赖项。

让我们假设 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);

服务管理器将查找,收集并运行工厂,然后返回注入依赖项的类实例。