【发布时间】: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