假設:Event\Service\EventService
是我的私人物品,與Event\Entity\Event
實體ZF2:在Zend的形式getServiceLocator等效
此代碼在ActionController的工作:
$eventService = $this->getServiceLocator()->get('Event\Service\EventService');
我怎樣才能$eventService
在一個Zend\Form\Form
一樣的方法?
假設:Event\Service\EventService
是我的私人物品,與Event\Entity\Event
實體ZF2:在Zend的形式getServiceLocator等效
此代碼在ActionController的工作:
$eventService = $this->getServiceLocator()->get('Event\Service\EventService');
我怎樣才能$eventService
在一個Zend\Form\Form
一樣的方法?
你有兩個選擇,如果你有這樣的相關性。在你的情況下,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
對象。這是注入一個Service
成Form
一個例子:
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');
}
}
然而,這第二個選項夫婦不必要聯軸器你的代碼,這使得它很難測試你的代碼。所以請使用依賴注入,而不是自己拉依賴關係。只有一個,你可能會想自己:)拉動的依賴
您可以使用module.php中的所有選項來配置表單。在下面的代碼我:
代碼:
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');
使用表單元素管理器來獲取表單在您的控制器的情況下屈指可數:
$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');
}
}
對不起,但我不明白這是什麼代碼... – chrvadala
我擴展了答案。希望現在更清楚 – michaelbn