ZF2:如何在控制器内创建模型的新实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZF2:如何在控制器内创建模型的新实例相关的知识,希望对你有一定的参考价值。

我开始学习ZF2依赖注入的好处,并且对如何在控制器内创建模型的新实例感到有点困惑。

我知道我可以使用:$ this-> getServiceLocator() - > get('Crumb'),但我读过它被认为是在控制器中使用serviceLocator的反模式。

为了解决这个问题:我有一个类Breadcrumbs和一个类Crumb。它看起来类似于:

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类是一个模型,因此在Controller中实例化它是完全可以接受的。

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

以上是关于ZF2:如何在控制器内创建模型的新实例的主要内容,如果未能解决你的问题,请参考以下文章

创建片段的新实例时菜单未膨胀

ZF2:在服务构造函数中注入变量

在片段中接收 NFC 的应用程序创建托管活动的新实例

使用json模型的zf2视图

使用 ZfcUser 的控制器的简单 ZF2 单元测试

ZF2 日志 curl 请求