【问题标题】:ZF2: how to create a new instance of a model inside a controllerZF2:如何在控制器内创建模型的新实例
【发布时间】: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


【解决方案1】:

由于您的 Crumb 类是一个模型,因此在 Controller 中实例化它是完全可以接受的。

根据您的用例,通过服务创建新的 Crumbs 可能更合适,例如CrumbService->create($data);。然后,您将通过工厂将服务注入控制器,并相应地更新您的模块配置(即确保您的控制器设置为通过工厂实例化而不是作为可调用类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多