猿问

如何使用 PHP 反射 API 编写和使用 PHP 依赖注入容器

我正在尝试在纯 OOP 应用程序中实现一个简单的 DI。我想使用依赖注入来管理许多服务(数据库、请求验证器、缓存等)。我读过很多博客,喜欢tech-tajawal 的这篇博客,但我真的不明白应该在哪里包含 tech-tajawal 写的容器。有人可以告诉我怎么做吗?


我想要它干净,因此想要使用基于构造函数的注入。所以如果我有一个类,让我们说AbstractBaseController哪个将注入一个名为 的依赖项Request,所以我会写:


php:


<?php


     namespace src\controllers;

     use system\middlewares\Request as Request;


     abstract class AbstractBaseController {


         private $request;


         public function __construct(Request $request) {

             $this->request = $request;

             return $this;

         }


     }

但这只是抛出


致命错误:未捕获的类型错误:传递给 src\controllers\AbstractBaseController::__construct() 的参数 1 必须是 system\middlewares\Request 的实例,没有给出`


我认为来自 tech-tajawal 的容器必须以某种方式包含在我的项目根目录中,但我不知道如何。


请原谅我的幼稚,因为我总是依赖于框架。


慕森王
浏览 163回答 1
1回答

芜湖不芜

你应该在你的应用程序开始的时候实例化你的容器(想想一个引导类,或者甚至在 index.php 本身的顶部,考虑一个非常简单的应用程序),因为你需要在所有后续操作之前准备好容器服务的实例化。在容器实例化之前唯一可能执行的其他事情是与配置相关的那些,因为容器正常工作通常需要这些(配置参数、PSR-4 自动加载配置等)。例如,假设您有一个称为MyController扩展抽象类的类AbstractBaseController。然后,例如,在 index.php 上,您可以实例化您的容器和控制器://index.php$container = new Container();$controller = $container->get('namespace\of\MyController');$controller->render();当您这样做时,来自构造函数的所有依赖项都将由容器库的自动装配模块处理。在实际应用中,控制器的实例化通常在路由器内部处理,路由器将 URL 地址、方法和参数映射到容器要加载的不同类。自动装配的一个经验法则是,您永远不能再new namespace\of\MyController()直接调用,因为手动实例化它需要您传递每个构造函数依赖项(因此您并没有真正使用自动装配功能)。实例化它的正确方法始终是使用$container->get('namespace\of\MyController').
随时随地看视频慕课网APP
我要回答