Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2:如何在控制器内创建模型的新实例_Php_Design Patterns_Dependency Injection_Zend Framework2_Service Locator - Fatal编程技术网

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

Php ZF2:如何在控制器内创建模型的新实例,php,design-patterns,dependency-injection,zend-framework2,service-locator,Php,Design Patterns,Dependency Injection,Zend Framework2,Service Locator,我开始学习ZF2依赖注入的好处,对于如何在控制器中创建模型的新实例有点困惑 我知道我可以使用:$this->getServiceLocator()->get('Crumb'),但我读过,在控制器中使用serviceLocator被认为是一种反模式 把这个问题带到生活中:我有一个班级面包屑和一个班级面包屑。它看起来像这样: 我不知道如何创建crump的实例。 如果我遵循选项1,我就不能使用工厂将任何依赖项注入到Crumb中。 如果我遵循选项2,我将使用serviceLocator,它是一种反模式

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

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

把这个问题带到生活中:我有一个班级面包屑和一个班级面包屑。它看起来像这样:

我不知道如何创建crump的实例。 如果我遵循选项1,我就不能使用工厂将任何依赖项注入到Crumb中。 如果我遵循选项2,我将使用serviceLocator,它是一种反模式


我遗漏了什么明显的东西吗?

因为您的crump类是一个模型,所以在控制器中实例化它是完全可以接受的


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

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


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

«我不能使用工厂将任何依赖项注入CREAM»-您需要哪种依赖项?一般来说,如果您需要使用工厂在控制器中创建对象,您将注入工厂并在那里调用它。B但很可能您不需要它。好吧,这只是一个示例,在我的应用程序中存在有依赖项和无依赖项。但是如果我理解正确,您宁愿使用“new Crumb()“如果它没有任何依赖项,那么在serviceManager中将它注册为可调用的吗?好吧,我会将它委托给服务层,作为适当的域用例的一部分,以一种混合MVC/ADR()的方式处理它。”,以减少应用程序和业务逻辑之间的耦合。另一方面,面包屑似乎确实是一个表示问题,因此它们可能被视为一个模型,但更多的是在ViewModel的意义上,如中。也就是说,对于玩具应用程序,我可能会使用直接实例化。嗨。只是一个站点说明,或者如果您不断更新ZF2 framework I在应用程序中:从2.5版开始,ActionController对getServiceLocator()的调用会产生一个用户弃用警告/错误方法已消失。您可能已经注意到依赖项将如何工作。«我不能使用工厂将任何依赖项注入CREAM»-您需要哪种类型的依赖项?一般来说,如果您需要使用工厂在控制器中创建对象,您将注入工厂并在那里调用它。但您可能不需要它。好吧,这只是一个例子,我的应用程序中存在有依赖项和无依赖项。但如果我理解正确,您宁愿使用“new Crumb()“如果它没有任何依赖项,那么在serviceManager中将它注册为可调用的吗?好吧,我会将它委托给服务层,作为适当的域用例的一部分,以一种混合MVC/ADR()的方式处理它。”,以减少应用程序和业务逻辑之间的耦合。另一方面,面包屑似乎确实是一个表示问题,因此它们可能被视为一个模型,但更多的是在ViewModel的意义上,如中。也就是说,对于玩具应用程序,我可能会使用直接实例化。嗨。只是一个站点说明,或者如果您不断更新ZF2 framework I在您的应用程序中:从2.5版开始,ActionController对getServiceLocator()的调用会产生一个用户弃用警告/错误。然后在ZF3中,getServiceLocator()方法消失了。您可能会注意到依赖项将如何工作。
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);
    }
}