
ThinkPHP6.0 容器和依赖注入
发布日期:2021-05-09 04:16:32
浏览次数:16
分类:博客文章
本文共 1683 字,大约阅读时间需要 5 分钟。
分为如下两部分:
依赖注入
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入;
在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
案例:
// 模型层 Onenamespace 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 文件,用于批量绑定类到容器中;
系统内置了很多常用的类库,以便开发者快速调用;
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月26日 10时57分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
2019-03-11
记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
2019-03-11
JavaScript高级程序设计第四版学习记录-第九章代理与反射
2019-03-11
怎么解决Windows 10文件/文件夹正在使用无法删除
2019-03-11
F28335第九篇——通用IO
2019-03-11
STM32F429第十一篇之数据类型
2019-03-11
web项目开发记录
2019-03-11
matlab函数:sprintf详解
2019-03-11
matlab函数:fix 向0取整
2019-03-11
ORCAD创建元件库时,格点对不起怎么办
2019-03-11
Allegro中如何消除器件本身Pin间距报错
2019-03-11
AD中拖动器件,无法移动在一起如何解决
2019-03-11
linux--练习001-基础类型
2019-03-11
python内存地址和编译字节码
2019-03-11
Flask--简介
2019-03-11
Flask模板--过滤器与测试器
2019-03-11
16 python基础-恺撒密码
2019-03-11
06.1 python基础--结构控制
2019-03-11
Frame--Api框架
2019-03-11
Frame--WEB框架
2019-03-11