假设: Event\Service\EventService
是我个人的目标与工作Event\Entity\Event
实体
此代码工作在ActionController的:
$eventService = $this->getServiceLocator()->get('Event\Service\EventService');
我怎样才能获得$eventService
在Zend\Form\Form
以同样的方式?
假设: Event\Service\EventService
是我个人的目标与工作Event\Entity\Event
实体
此代码工作在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');
}
}