【发布时间】:2018-09-12 07:54:13
【问题描述】:
我开始了解 ZF2 依赖注入的好处,但对如何在控制器内创建模型的新实例有点困惑。
我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过它被认为是在控制器中使用 serviceLocator 的反模式。
为了解决这个问题:我有一个面包屑类和一个面包屑类。它看起来像这样:
class Breadcrumbs
{
private $crumbs = array();
public function getCrumbs(){
return $this->crumbs;
}
public function addCrumb(Crumb $crumb){
$this->crumbs[] = $crumb;
}
}
class Crumb
{
private $title;
private $url;
public function setTitle($title){
$this->title = $name;
}
}
class DetailController extends AbstractActionController
{
private $breadcrumbs;
public function __construct(Breadcrumbs $breadcrumbs){
$this->breadcrumbs = $breadcrumbs;
}
public function indexAction(){
$crumb = new Crumb(); //Option 1
$crumb = $this->getServiceLocator()->get('Crumb'); //Option 2
$crumb = ?? //Option 3 ??
$this->breadcrumbs->addCrumb($crumb);
}
}
我很困惑如何创建 Crumb 的实例。 如果我遵循选项 1,我不能使用工厂将任何依赖项注入 Crumb。 如果我遵循选项 2,我会使用 serviceLocator,它是一种反模式。
我错过了什么明显的东西吗?
【问题讨论】:
-
«我不能使用工厂将任何依赖项注入 Crumb» — 你需要什么样的依赖项?一般来说,如果你需要使用工厂在控制器中创建你的对象,你会注入工厂并在那里调用它。但很可能你不需要它。
-
好吧,这只是一个例子,在我的应用程序中存在依赖关系和不依赖关系。但是,如果我理解正确,如果它没有任何依赖项,您宁愿使用“new Crumb()”而不是将其注册为 serviceManager 中的可调用对象?
-
好吧,我会将其委托给服务层,该服务层将在一种混合 MVC/ADR (Action-Domain-Responder) 中将其作为适当域用例的一部分进行处理,以减少两者之间的耦合应用程序和业务逻辑。另一方面,面包屑似乎确实是一个演示问题,因此它们可能被视为一个模型,但更多的是在 ViewModel 意义上,如MVVM。也就是说,对于玩具应用程序,我可能会直接实例化。
-
嗨。只是一个站点注释,或者如果您在应用程序中不断更新 ZF2 框架:从版本 2.5 开始,ActionController 对 getServiceLocator() 的调用会产生用户弃用警告/错误。然后在 ZF3 中 getServiceLocator() 方法消失了。您可能会关注依赖项将如何工作。 Example.
标签: php design-patterns dependency-injection zend-framework2 service-locator