gpt4 book ai didi

php - ZF2 : Equivalent of getServiceLocator in Zend Form

转载 作者:行者123 更新时间:2023-12-04 13:50:33 24 4
gpt4 key购买 nike

假设:Event\Service\EventService 是我与 Event\Entity\Event 实体一起工作的个人对象

此代码在 ActionController 中工作:

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

如何以同样的方式在 Zend\Form\Form 中获取 $eventService

最佳答案

如果你有这样的依赖关系,你有两个选择。在您的例子中,Form 依赖于 Service。第一个选项是注入(inject)依赖项:

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

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

在这种情况下,$form 并不知道 $service 的位置,这被普遍认为是个好主意。为确保每次需要 Form 时都不需要自己设置所有依赖项,您可以使用服务管理器创建一个工厂。

创建工厂的一种方法(还有更多)是将 getServiceConfiguration() 方法添加到您的模块类,并使用闭包来实例化 Form 对象。这是将 Service 注入(inject) 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。例如,在您的 Controller 中:

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

第二个选项是拉取依赖项。虽然不建议将其用于表单之类的类,但您可以注入(inject)服务管理器,以便表单可以自行提取依赖项:

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');
}
}

然而,这第二个选项将您的代码与不必要的耦合耦合起来,这使得测试您的代码变得非常困难。所以请使用依赖注入(inject),而不是自己拉取依赖。只有少数情况下您可能想自己提取依赖项:)

关于php - ZF2 : Equivalent of getServiceLocator in Zend Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com