ZF2:如何在控制器内创建模型的新实例
ZF2: how to create a new instance of a model inside a controller
我开始了解 ZF2 依赖项注入的好处,并且对如何在控制器内创建模型的新实例感到有点困惑。
我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过在控制器中使用 serviceLocator 被认为是一种反模式。
为了解决这个问题:我有一个 class 面包屑和一个 class 面包屑。它看起来类似于:
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 class 是一个模型,在控制器中实例化它是完全可以接受的。
根据您的用例,通过服务创建新的 Crumbs 可能更合适,例如CrumbService->create($data);
。然后您将通过工厂将服务注入控制器,并相应地更新您的模块配置(即确保您的控制器设置为通过工厂实例化而不是作为可调用的 class.
我开始了解 ZF2 依赖项注入的好处,并且对如何在控制器内创建模型的新实例感到有点困惑。
我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过在控制器中使用 serviceLocator 被认为是一种反模式。
为了解决这个问题:我有一个 class 面包屑和一个 class 面包屑。它看起来类似于:
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 class 是一个模型,在控制器中实例化它是完全可以接受的。
根据您的用例,通过服务创建新的 Crumbs 可能更合适,例如CrumbService->create($data);
。然后您将通过工厂将服务注入控制器,并相应地更新您的模块配置(即确保您的控制器设置为通过工厂实例化而不是作为可调用的 class.