2013-12-16 92 views
0

實際上,在我的ZF2項目中,我爲模型,表單等創建了基類。例如:我注意到我可能需要在我的模型中使用ServiceLocator,所以我創建了實現ServiceLocatorAwareInterface的Application \ Model \ Base類。這也適用於我的表格。Zend Framework中的依賴注入2

我在想如果這是做這個或者我應該在構造函數中傳遞依賴的最好方法。所以我今天帶着一個問題:

我有一個窗體(Application \ Form \ Customer \ Add)需要在其構造函數中使用ServiceLocator。但是在這一點上,ServiceLocator尚未設置(構造函數在setServiceLocator()之前調用)。

那麼,您認爲最好的解決方法是什麼?我應該通過構造函數傳遞依賴關係還是繼續使用我實際使用的方法(並嘗試以另一種方式解決客戶表單問題)?

+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例我認爲更好的是將'ServiceManager'傳遞給'Module.php'中的Model構造函數,並將'ServiceManager'傳遞給Form constru當你從Form類獲得實例時,控制器在控制器中。 –

回答

0

我認爲,最好爲您的表單創建工廠,並注入只需要服務定位器的依賴關係,而不是整個服務定位器。

這家工廠與水化的例子:

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', 
    ], 
],