2016-05-26 75 views
0

我有一個工廠實現FactoryInterface,如:ZF2,類實施FactoryInterface傳遞的ServiceLocator實例作爲屬性

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

現在,所有的碼是createService方法(多if S的內部,某些查詢,等等。 )這使得該方法漫長且難以遵循。我想通過將一些代碼提取到單獨的方法來重構代碼。問題在於我的情況,我最終將$serviceLocator->getServiceLocator()的實例傳遞給了這些方法中的每一個,這實際上沒有問題,但感覺很難看。

我想知道是否有一種優雅的方式,可能分配SomeFactory$serviceLocator->getServiceLocator()的屬性,而不僅僅是在每個提取的方法中傳遞屬性。

回答

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()方法

+0

多'if's注入它,例如,我準備需要注射的物體。那麼如果真的進入服務? –

+0

@DimaDz這取決於你的期望。提供您想要實現的內容以及如何構建您的應用程序的例子。通常,一個服務可以在控制器中使用。 – ceadreak