【问题标题】:Dependency Injection of Dynamically Called Class动态调用类的依赖注入
【发布时间】:2018-09-25 16:35:34
【问题描述】:

作为我学习过程的一部分,我正在构建自己的 MVC 框架,它不仅可以帮助我学习,而且希望它可以帮助我保持我未来的代码更简洁和更易于维护。目前我正在努力解决依赖注入。

这就是我正在做的事情:

我的超简单 MVC 框架爆炸 $_SERVER['REQUEST_URI'] 并期望第一个元素是类,第二个元素是方法,而任何剩余的元素都是参数数组。这一切都非常出色。

我有一个基本的 Controller 类,我的所有核心类都对其进行了扩展。这个 Controller 类的唯一功能是促进模型类和视图的需求和实例化,如下所示:

class Controller {

protected $modelsPath = ROOT . 'app' . DS . 'models' . DS;
protected $viewsPath = ROOT . 'app' . DS . 'views' . DS;

public function model($model) {
    $model = ucfirst(strtolower($model));
    if (file_exists($this->modelsPath . $model . ".model.php")) {
        require_once $this->modelsPath . $model . ".model.php";
        return new $model;
    } else {
        return false;
    }
}

public function view($view, $data = []) {
    $view = strtolower($view);
    if (file_exists($this->viewsPath . $view . DS. $view . "View.php")) {
        require_once $this->viewsPath . $view . DS . $view . "View.php";
    } else {
        die('View does not exist');
    }
}

这一切都按预期工作。

然后我突然想到,我可以在我的 Controller 类中使用 get_called_class() 函数来实质上自动加载支持的 Model 类(如果存在)。所以我将此代码添加为我的 Controller 类中的 __construct 函数:

    protected $modelToCall = null;

    public function __construct() {
        $modelToCall = ucfirst(strtolower(get_called_class()));
        if (file_exists($this->modelsPath . $modelToCall . ".model.php")) {
            require_once $this->modelsPath . $modelToCall . ".model.php";
            $this->modelToCall = new $modelToCall;
        }
    }

因为这是在我的基础控制器中调用的,它由我刚刚调用的任何类扩展,这允许我从我的父类中使用我的模型的方法:

class Tests extends Controller {
    public function test() {
        $this->modelToCall->testsModelMethod();
    }
}

现在我的问题:

这是否被视为依赖注入?如果没有,有没有办法从以这种方式动态加载的模型正确完成依赖注入?

与简单地从父控制器实例化相比,在我的基本控制器中自动实例化可能没有任何好处?

正如我所说,我正在学习,我想在这种情况下,我只是在向比我更有经验和知识的人寻求指导,所以我希望能对这个主题有所了解并避免严重的编程错误会咬人我以后。

提前感谢您的考虑和耐心等待。

【问题讨论】:

  • 不,这不是依赖注入。但是这个问题太长太冗长了。尽量将其简化为问题的基本描述和必要的代码。
  • 好吧,至少我们中的一个人练习简洁。哈哈。因此,如果它不是依赖注入,您对在这种情况下如何完成 DI 有任何指导吗?如前所述,我正在努力学习。

标签: php oop dynamic dependency-injection


【解决方案1】:

好的,我想我已经回答了我自己的问题。

从模型的控制器调用模型是完全正常的,这是我的控制器自动执行的操作。但这不是依赖注入,正如@yivi 指出的那样。

但是,我认为是依赖注入。

我回到我的简单 MVC 框架的 boostrap 并在顶部实例化了我的 Database 类。然后我可以将它传递到我的 Controller 类中,然后我可以将它注入到每个动态加载的模型中,如下所示:

public $database;
protected $modelToCall;

public function __construct($database) {
    $this->database = $database;
    $tmpClass = strtolower(get_called_class());
    $modelToCall = rtrim(ucfirst($tmpClass), 's');
    if (file_exists($this->modelsPath . $modelToCall . ".php")) {
        require_once $this->modelsPath . $modelToCall . ".php";
        $this->modelToCall = new $modelToCall($database);
    }
}

现在,在任何控制器中,我都可以通过简单地使用 $this->modelToCall 来调用该控制器的模型方法,并且我可以从每个模型中完全访问我的 Database 类,并且我只需将其实例化一次。

它有效,但我现在的术语是否正确?

提前致谢。

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多