作为我学习过程的一部分,我构建了自己的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();
}
}
现在我的问题:
这是否被视为依赖注入?如果没有,是否有办法从以这种方式动态加载的模型中正确完成依赖注入?
也许在我的基本控制器中自动实例化没有任何好处,而只是从我的父控制器实例化?
正如我所说,我正在学习,我想在这种情况下,我只是寻求FAR人员的指导,比我更有经验和知识,所以我希望能够理解这个主题并避免严肃的编程以后会咬我的错误。
提前感谢您的考虑和耐心。
答案 0 :(得分:-1)
好的,我想我已经回答了我自己的问题。
这是完全正常的,并期望从模型的控制器调用模型,这是我的控制器自动执行的操作。但这不是依赖注入,正如@yivi指出的那样。
然而,我认为,依赖于IS依赖注入。
我回到了我的简单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
即可调用该控制器的模型方法,并且我可以从每个模型完全访问我的数据库类,而且我只能使用不得不实例化一次。
它有效,但我现在的术语是否正确?
提前致谢。