Php ZF2:如何在控制器内创建模型的新实例
我开始学习ZF2依赖注入的好处,对于如何在控制器中创建模型的新实例有点困惑 我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过,在控制器中使用serviceLocator被认为是一种反模式 把这个问题带到生活中:我有一个班级面包屑和一个班级面包屑。它看起来像这样: 我不知道如何创建crump的实例。 如果我遵循选项1,我就不能使用工厂将任何依赖项注入到Crumb中。 如果我遵循选项2,我将使用serviceLocator,它是一种反模式Php ZF2:如何在控制器内创建模型的新实例,php,design-patterns,dependency-injection,zend-framework2,service-locator,Php,Design Patterns,Dependency Injection,Zend Framework2,Service Locator,我开始学习ZF2依赖注入的好处,对于如何在控制器中创建模型的新实例有点困惑 我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过,在控制器中使用serviceLocator被认为是一种反模式 把这个问题带到生活中:我有一个班级面包屑和一个班级面包屑。它看起来像这样: 我不知道如何创建crump的实例。 如果我遵循选项1,我就不能使用工厂将任何依赖项注入到Crumb中。 如果我遵循选项2,我将使用serviceLocator,它是一种反模式
我遗漏了什么明显的东西吗?因为您的crump类是一个模型,所以在控制器中实例化它是完全可以接受的
根据您的用例,通过服务创建新的碎屑可能更合适,例如
CrumbService->create($data)代码>。然后,您将通过工厂将服务注入控制器,并相应地更新您的模块配置(即,确保您的控制器设置为通过工厂而不是作为可调用类实例化)。因为您的Crumb类是一个模型,所以在控制器中实例化它是完全可以接受的
根据您的使用情况,可能更适合通过服务创建新的碎屑,例如CrumbService->create($data);
。然后通过工厂将服务注入控制器,并相应地更新模块配置(即,确保您的控制器设置为通过工厂而不是作为可调用类实例化。«我不能使用工厂将任何依赖项注入CREAM»-您需要哪种依赖项?一般来说,如果您需要使用工厂在控制器中创建对象,您将注入工厂并在那里调用它。B但很可能您不需要它。好吧,这只是一个示例,在我的应用程序中存在有依赖项和无依赖项。但是如果我理解正确,您宁愿使用“new Crumb()“如果它没有任何依赖项,那么在serviceManager中将它注册为可调用的吗?好吧,我会将它委托给服务层,作为适当的域用例的一部分,以一种混合MVC/ADR()的方式处理它。”,以减少应用程序和业务逻辑之间的耦合。另一方面,面包屑似乎确实是一个表示问题,因此它们可能被视为一个模型,但更多的是在ViewModel的意义上,如中。也就是说,对于玩具应用程序,我可能会使用直接实例化。嗨。只是一个站点说明,或者如果您不断更新ZF2 framework I在应用程序中:从2.5版开始,ActionController对getServiceLocator()的调用会产生一个用户弃用警告/错误方法已消失。您可能已经注意到依赖项将如何工作。«我不能使用工厂将任何依赖项注入CREAM»-您需要哪种类型的依赖项?一般来说,如果您需要使用工厂在控制器中创建对象,您将注入工厂并在那里调用它。但您可能不需要它。好吧,这只是一个例子,我的应用程序中存在有依赖项和无依赖项。但如果我理解正确,您宁愿使用“new Crumb()“如果它没有任何依赖项,那么在serviceManager中将它注册为可调用的吗?好吧,我会将它委托给服务层,作为适当的域用例的一部分,以一种混合MVC/ADR()的方式处理它。”,以减少应用程序和业务逻辑之间的耦合。另一方面,面包屑似乎确实是一个表示问题,因此它们可能被视为一个模型,但更多的是在ViewModel的意义上,如中。也就是说,对于玩具应用程序,我可能会使用直接实例化。嗨。只是一个站点说明,或者如果您不断更新ZF2 framework I在您的应用程序中:从2.5版开始,ActionController对getServiceLocator()的调用会产生一个用户弃用警告/错误。然后在ZF3中,getServiceLocator()方法消失了。您可能会注意到依赖项将如何工作。
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);
}
}