ZF2,实现FactoryInterface的类将ServiceLocator实例作为属性

时间:2016-05-26 20:18:38

标签: php zend-framework zend-framework2

我有一个实现FactoryInterface的工厂,如:

class SomeFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // the code to create SomeClass instance
    }
}

现在,所有代码都在createService方法内(多个if s,一些查询等),这使得该方法很长且难以遵循。我想通过将一些代码段提取到单独的方法来重构代码。问题出在我的情况下,我最终在每个方法中传递了$serviceLocator->getServiceLocator()的实例,这实际上没问题,但感觉很难看。

我想知道是否有一种优雅的方式来分配SomeFactory $serviceLocator->getServiceLocator()的属性,而不仅仅是在每个提取的方法中传递它。

1 个答案:

答案 0 :(得分:0)

我认为你并不真正了解工厂的使用情况。

工厂仅用于在另一个对象中注入依赖项,例如ControllerService

所以,当然,这取决于你想做什么,但我认为你想创建一个Service来做一些思考。

示例:

class MyService implements ServiceLocatorAwareInterface
{
    use ServiceLocatorAwareTrait; // used to inject SL getter and setter in your code

    public function myMethod1()
    {
        $formElementManager = $this->getServiceLocator()->get('formElementManager');
        // ... etc ...
    }

    public function myMethod9999() ......
}

class MyServiceFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $myService = new MyService();

        $myService->setServiceLocator($serviceLocator);
        $myService->setAnotherProperty(...);

        return $myService;
    }
}

如果ServiceLocator课程中确实需要MyService(),建议您将其__construct()方法注入<{p}}