Zend Framework 2中的依赖注入

时间:2013-12-16 18:04:53

标签: dependency-injection zend-framework2 service-locator

实际上,在我的ZF2项目中,我已经为模型,表单等创建了基类。例如:我注意到我可能在模型中需要ServiceLocator,因此我创建了一个实现ServiceLocatorAwareInterface的类Application \ Model \ Base。这也适用于我的表格。

我在想,如果这是最好的方法,或者我应该在构造函数中传递依赖项。所以今天我遇到了一个问题:

我有一个表单(Application \ Form \ Customer \ Add),需要在其构造函数中使用ServiceLocator。但是在这一点上,尚未设置ServiceLocator(在setServiceLocator()之前调用构造函数)。

那么,您认为解决这个问题的最佳方法是什么?我应该通过构造函数传递依赖项还是继续使用我实际使用的这种方法(并尝试以另一种方式解决客户表单问题)?

1 个答案:

答案 0 :(得分:0)

我认为,最好为您的表单创建工厂,并从服务定位器注入仅需要的依赖项,而不是整个服务定位器。

这家带有保湿器的工厂的例子:

namespace Application\Form;

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

class AddFormFactory implements FactoryInterface
{
    /**
     * @param ServiceLocatorInterface $serviceLocator
     * @return AddForm
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // assumes hydrator is already registered in service locator
        $form = new AddForm(
            $serviceLocator->get('MyAddFormHydrator')
        );

        return $form;
    }
}

您的AddForm示例:

namespace Application\Form;

use Zend\Form\Form;
use Zend\Stdlib\Hydrator\HydratorInterface;

class AddForm extends Form
{
    public function __construct(HydratorInterface $hydrator, $name = null, $options = [])
    {
        parent::__construct($name, $options);

        // your custom logic here
    }
}

最后,您必须将此添加到服务管理器配置中:

'service_manager'  => [
    'factories' => [
        'Application\Form\AddForm' => 'Application\Form\AddFormFactory',
    ],
],