0

我开始学习 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,它是一种反模式。

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

4

1 回答 1

2

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

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

于 2018-09-14T10:35:17.723 回答