ZF2, класс, реализующий экземпляр ServiceLocator factoryinterface pass в качестве атрибута

У меня есть фабрика, которая реализуетFactoryInterface, как:

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

Теперь весь код находится внутри createServiceметода (несколько ifs, некоторые запросы и т.д.) что делает метод долгим и трудным для следования. Я хотел бы рефактировать код, извлекая некоторые части кода в отдельные методы. Проблема в том, что в моем случае я в конечном итоге передаю пример $serviceLocator->getServiceLocator()в каждом из этих методов, что на самом деле не проблема, но чувствует себя уродливо.

Мне было интересно, есть ли элегантный способ, возможно, присвоения атрибутаSomeFactory $serviceLocator->getServiceLocator(), чем просто передача его в каждом извлеченном методе.

1 ответ

  1. Я думаю, что вы не очень понимаете использование фабрик.

    Фабрика используется только для введения зависимостей в другой объект, например a Controllerили a Service.

    Конечно, это зависит от того, что вы хотите сделать, но я думаю, что вы хотите создать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()метод