假设: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
同样的方式进入?
如果你有这样的依赖,你有两个选择。在您的情况下, aForm
取决于 a 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
这是将 a注入a 的示例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');
}
}