2012-06-06 28 views
2

假設:Event\Service\EventService是我的私人物品,與Event\Entity\Event實體ZF2:在Zend的形式getServiceLocator等效

此代碼在ActionController的工作:

$eventService = $this->getServiceLocator()->get('Event\Service\EventService'); 

我怎樣才能$eventService在一個Zend\Form\Form一樣的方法?

回答

5

你有兩個選擇,如果你有這樣的相關性。在你的情況下,Form取決於Service。第一個選項是注入依賴

class Form 
{ 
    protected $service; 
    public function setService(Service $service) 
    { 
    $this->service = $service; 
    } 
} 

$form = new Form; 
$form->setService($service); 

在這種情況下,$form不知道的$service的位置,並通常被認爲是一個好主意。爲了確保在每次需要Form時都不需要自己設置所有依賴關係,可以使用服務管理器創建工廠。

創建工廠的一種方式(還有更多)是將getServiceConfiguration()方法添加到您的模塊類並使用閉包來實例化Form對象。這是注入一個ServiceForm一個例子:

public function getServiceConfiguration() 
{ 
    return array(
     'factories' => array(
      'Event\Form\Event' => function ($sm) { 
       $service = $sm->get('Event\Service\EventService'); 
       $form = new Form; 
       $form->setService($service); 

       return $form; 
      } 
     ) 
    ); 
} 

然後你只需從你的服務經理Form。例如,在你的控制器:

$form = $this->getServiceLocator()->get('Event\Form\Event'); 

的第二個選擇是拉動的依賴。雖然不建議類,如表格,你可以注入一個服務管理器,這樣的形式可以拉動的依賴本身:

class Form 
{ 
    protected $sm; 

    public function setServiceManager(ServiceManager $sm) 
    { 
     $this->sm = $sm; 
    } 

    /** 
    * This returns the Service you depend on 
    * 
    * @return Service 
    */ 
    public function getService() 
    { 
     return $this->sm->get('Event\Service\EventService'); 
    } 
} 

然而,這第二個選項夫婦不必要聯軸器你的代碼,這使得它很難測試你的代碼。所以請使用依賴注入,而不是自己拉依賴關係。只有一個,你可能會想自己:)拉動的依賴

3

您可以使用module.php中的所有選項來配置表單。在下面的代碼我:

  • 名稱服務爲my_form
  • 準新對象\ MyModule的\表格\ MyForm的與此服務
  • 注入服務 'so​​mething1' 到_construct()
  • 注入服務 'so​​mething2' 到setSomething()

代碼:

public function getServiceConfiguration() 
{ 
    return array(
     'factories' => array(
      'my_form' => function ($sm) { 
       $model = new \MyModule\Form\MyForm($sm->get('something1')); 
       $obj = $sm->get('something2'); 
       $model->setSomething($obj); 
       return $model; 
      }, 
     ), 
    ); 
} 

然後在控制器下面一行將填充你的對象與所有所需的依賴

$form = $this->getServiceLocator()->get('my_form');

+0

對不起,但我不明白這是什麼代碼... – chrvadala

+1

我擴展了答案。希望現在更清楚 – michaelbn

0

使用表單元素管理器來獲取表單在您的控制器的情況下屈指可數:

$form = $this->getServiceLocator()->get('FormElementManager')->get('Path\To\Your\Form', $args); 

然後在你的形式將成爲本次

<?php 
    namespace Your\Namespace; 
    use Zend\Form\Form; 
    use Zend\ServiceManager\ServiceLocatorAwareInterface; 
    use Zend\ServiceManager\ ServiceLocatorAwareTrait; 

    class MyForm extends Form implements ServiceLocatorAwareInterface { 
    use ServiceLocatorAwareTrait; 

    public function __construct($class_name, $args) 
    { 
     /// you cannot get the service locator in construct. 
    } 
    public function init() 
    { 
     $this->getServiceLocator()->get('Path\To\Your\Service'); 
    } 
}