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

问题描述 投票:0回答:1

我开始学习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这是一个反模式。

我错过了什么明显的东西?

php design-patterns dependency-injection zend-framework2 service-locator
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.