gpt4 book ai didi

php - 使用依赖注入(inject)创建实例?

转载 作者:可可西里 更新时间:2023-11-01 01:12:45 25 4
gpt4 key购买 nike

我正在尝试将 DI 实现到我的应用程序中。下面是我的路线的一个片段,每个路线都有自己的 Controller ,其中有一个方法来返回 View 。

$router->addRoute('GET', '/', ['App\Controllers\Frontend\Guest\LoginController', 'getView']);


假设我有多个 Controller ,我必须在内部传递一个模板类的实例。

class LoginController {

private $template;

public function __construct(Template $template) {
$this->template = $template;
}

public function getView() {
$this->template->renderTemplate('index.html');
}

}


我使用我的模板类与 Twig 交互,告诉它做什么。

class Template {

private $environment;

public function __construct(Twig_Environment $environment) {
$this->environment = $environment;
}

public function render($template, array $vars) {
return $this->environment->render($template, $vars);
}

}

现在,我遇到的问题是我应该在哪里创建这些 Controller 的实例?当然,我不会只为我的每个 Controller 创建一个实例,那样会变得一团糟,对吧?

谁能给我一些建议,我是 DI 的新手。

最佳答案

您正在寻找的是依赖注入(inject)容器。我用的那个,Dice ,使用反射构建您的类图,并具有多个让您的生活更轻松的功能(缓存实例、共享实例(对数据库连接有用)等)。

基本上,它会从您提供给它的类开始查找所有依赖项,并根据需要创建它们。在您的示例中,在您的 FrontController(或您用作应用程序入口点的任何内容)中,您将执行以下操作:

<?php

$dice = new \Dice\Dice;

// use your router to pick a controller and then
$controller = $dice->create($controllerChosenByRouter);

就是这样,Dice 会将 Twig_Environment 实例化为 Template 实例,然后使用 Template 实例 LoginController在完全构建的 $controller 中,您将能够按照您的意愿使用它。

这当然只适用于类型提示依赖项。如果你的类的构造函数中有一些其他参数,你可以使用规则来传递它。例如,假设您的 LoginController 还需要一个用户名

public function __construct(Template $template, $username);

然后,您可以使用 constructParams 规则来设置 Dice 应设置的参数:

<?php
$rule = [
"constructParams" => ["yixoco"],
];
$dice->addRule("LoginController", $rule);

此外,如果您需要向未直接实例化的类添加规则,您也可以将 shared 设置为 true,该实例将每次需要时都会使用,因此它将使用您提供的确切参数:

$rule = [
"constructParams" => [true], // setting cache to true
"shared" => true,
];
$dice->addRule("Twig_Environment", $rule);
$dice->create("Twig_Environment");

所以现在,只要 Dice 需要它,就会使用 cache 参数设置为 trueTwig_Environment 实例。

看看文档,它有很多功能可以让您的应用更加灵活。当然还有更多负载,例如 Auyrin , PHP-DI , Pimple ,以及框架捆绑在一起的那些。 Here's如果您想对其进行更多研究,请使用速度基准。他们都有自己的做事方式,所以一定要仔细阅读他们,选择你最喜欢的和最符合你需要的!

关于php - 使用依赖注入(inject)创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com