动态调用类的依赖注入

时间:2018-04-16 02:21:41

标签: php oop dynamic dependency-injection

作为我学习过程的一部分,我构建了自己的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人员的指导,比我更有经验和知识,所以我希望能够理解这个主题并避免严肃的编程以后会咬我的错误。

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

1 个答案:

答案 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即可调用该控制器的模型方法,并且我可以从每个模型完全访问我的数据库类,而且我只能使用不得不实例化一次。

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

提前致谢。