我正在尝试在纯 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 的容器必须以某种方式包含在我的项目根目录中,但我不知道如何。请原谅我的幼稚,因为我总是依赖于框架。
1 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
你应该在你的应用程序开始的时候实例化你的容器(想想一个引导类,或者甚至在 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').
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报
0/150
提交
取消