-
ThinkPHP6.0 容器和依赖注入
分为如下两部分:
- 依赖注入
- 容器
-
依赖注入
-
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入;
-
在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
-
案例:
// 模型层 One namespace app\model; use think\Model; class One extends Model { public $username = 'laowen'; } // 控制器 namespace app\controller; use app\model\One; class TestOne { protected $one; public function __construct(One $one) { $this->one = $one; } public function index() { return $this->one->username; } }
-
依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束);
-
而传递的对象背后的那个类被自动绑定并且实例化了,这就是依赖注入;
-
支持使用依赖注入的场景包括(但不限于):
- 控制器架构方法;
- 控制器操作方法;
- 路由的闭包定义;
- 事件类的执行方法;
- 中间件的执行方法;
-
-
容器
-
依赖注入的类统一由容器管理的,大多数情况下是自动绑定和自动实例化的;
-
如果想手动来完成绑定和实例化,可以使用bind()和app()助手函数来实现;
class TestTwo { public function bind() { bind('one', 'app\model\One'); return app('one')->username; } } // bind('one' ,'...')绑定类库标识,这个标识具有唯一性,以便快速调用; // app('one') 快速调用,并自动实例化对象,标识严格保持一致包括大小写;
-
自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则:
class TestTwo { public function bind() { bind('one', 'app\model\One'); // 每次调用总是会重新实例化 return app('one',[], true)->username; // app()中第二参数,方法实例化对象的时候,传递参数; // 模型层通过构造函数来接收数据 // $one = app('one', [['test']], true); // return $one->username; } }
-
通过 app() 绑定一个类到容器中并自动实例化;
class TestTwo { public function bind() { return app('app\model\One')->username; } }
-
批量绑定到容器中
public function bind() { bind([ 'one' => 'app\model\One', 'user' => 'app\model\User' ]); // bind([ // 'one' => \app\model\One::class, // 'user' => \app\model\User::class // ]); // ::class 模式,不需要单引号; // 而是需要在最前面加上\,之前的加不加都行; return app('one')->username; }
-
系统提供了 provider.php 文件,用于批量绑定类到容器中;
-
系统内置了很多常用的类库,以便开发者快速调用;
-
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式