Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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容器和构造注入_Php_Dependency Injection - Fatal编程技术网

依赖注入PHP容器和构造注入

依赖注入PHP容器和构造注入,php,dependency-injection,Php,Dependency Injection,我有一个简单的问题 class controller{ $model; $view; $db; $array; public function __construct(Model $model, View $view, Database $db, Input $array){ $this->model = $model; $this->view = $view; $this->db= $db; $this->arra

我有一个简单的问题

class controller{

  $model;
  $view;
  $db;
  $array;

  public function __construct(Model $model, View $view, Database $db, Input $array){
    $this->model = $model;
    $this->view = $view;
    $this->db= $db;
    $this->array = $array;   
  }

  public function giveToModel{

    $this->model->someFunction($this->view, $this->db , $this->array);

  }

}
现在,我对编程有点陌生,所以我有几个问题。为了在编码中坚持某些原则,比如SOLID等等,DI是必须的。然而,对于如何在MVC框架中实现它,我有点不知所措。我只需要一些指针

至于上面的代码。我真的不确定那里的注射。是否需要通过构造函数注入所有这些内容。或者我应该通过函数“giveToModel”注入其中的一部分(View$View、Database$db、Input$array)

还有一个。我可以制作两个容器,例如:

class controllerDepen {

  public function loadModel($name){
    return new $name.'Model';
  }

  public function postArray(){
    return new $postData; //object that gathers all the $_POST data into one array
  }

}
另一个用于处理模型的依赖项,然后传递这些依赖项并使用它们设置依赖项

我的主要问题是:

  • 希望在某个点上有太多依赖项,无法正常通过_构造吗
  • 解耦类
  • 我知道像这样的事情是有DIC的,但是,我真的很想在使用这些之前先了解一下这个主题


    正如您所看到的,关于这个主题,我可能需要一些额外的解释。

    一般的规则是,如果没有特定的依赖项,类实例将无法工作,那么该依赖项应该通过构造函数注入。如果一个类实例可以在没有依赖项的情况下使用,但可以使用一个对其有利的类实例,那么可以通过构造函数(默认值=null)或在构造后通过setter方法注入它。在这种情况下,这是一个判断调用,其中一个是可以接受的,有一些因素,比如“在消费类的生命周期中,依赖实例可以被替换为不同的实例吗?”帮助通知决策)好的,我明白了。只通过构造函数传递您必须传递的内容。然后再补充一下这个问题。如果我在MVC框架内工作,我是否需要在引导类中创建视图的实例,然后通过控制器将其传递给模型,还是在控制器中创建并发送给模型?在这种特殊情况下,我怀疑控制器指示需要哪个视图?如果是这样的话,那么最好在DI容器中设置一个工厂(Auryn支持这一点,我怀疑大多数其他DI框架也支持),以确定特定的控制器并用正确的视图构造它。在这种情况下,delegate()和prepare()功能可能都相关。嗯。它会自动启动(分解$url调用右控制器)->控制器->模型->视图。然而,如果我要坚持DI概念,我必须为模型提供一个“外部”视图的实例。那么,我是在引导中创建视图,然后将其发送到控制器,然后再发送到模型,还是在控制器中实现一个容器来“生成”实例,然后从那里发送它。这就是让我困惑的地方