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.