TP6.0 容器和依赖注入_依赖注入

1. 什么是依赖注入


依赖注入本质上是指类的依赖通过构造器完成自动注入。

例如:在控制器构造方法或普通方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成

依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束),而传递对象的背后那个类被自动绑定并且实例化了,这就是依赖注入

2. 容器


依赖注入的类统一由容器管理的,大多数情况下是自动绑定和自动实例化的

如果想手动来完成绑定和实例化,可以使用 bind() 和 app() 助手函数实现

3. 使用示例



​​// 绑定类库标识,这个标识具有唯一性,以便快速调用​​
​​bind('one', \app\model\User::class);​​
​​// 快速调用并且自动实例化对象,类库标识严格区分大小写​​
​​app('one');​​
​​// 第二参数用于传参,​​
​​// 自动实例化对象的方式默认使用单例模式,第三参数为true时调用会重新实例化​​
​​app('one', [], true);​​

​​// 也可以直接绑定一个类到容器中并自动实例化​​
​​app(\app\model\User::class);​​

​​// 使用 bind([]) 可以批量绑定​​
​​// 不同系统有专门提供批量绑定的文件 app/provider.php​​
​​bind([​​
​​'user' => \app\model\User::class,​​
​​'admin' => \app\model\Admin::class,​​
​​]);​​

4. 容器 Provider 定义文件


框架文件 app/provider.php 用于定义容器类, 将类绑定到容器中

自己封装的一些类文件可以通过该文件将类绑定到容器中, 以便快速调用

​​<?php​​
​​use app\ExceptionHandle;​​
​​use app\Request;​​

​​// 容器Provider定义文件​​
​​return [​​
​​'think\Request' => Request::class,​​
​​'think\exception\Handle' => ExceptionHandle::class,​​
​​// 扩展类库​​
​​'math' => Math::class,​​
​​'layui' => Layui::class,​​
​​];​​

快速调用



​​app('layui')->table('用户列表', 10, $data);​​

 TP6.0 消息队列 topthink/think-queue

1. TP6.0 消息队列 topthink/think-queue


​topthink/think-queue​​ 是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包

github : ​​GitHub - top-think/think-queue: ThinkPHP 队列支持​

packagist : ​​topthink/think-queue - Packagist​

2. think-queue 各主版本对应适用的TP版本


think-queue 版本号

适用的TP版本

1.x

ThinkPHP5.0

2.x

ThinkPHP5.1

3.x

ThinkPHP6.0

3. 安装 topthink/think-queue


在应用根目录执行命令, 下载 ​​topthink/think-queue​​ 扩展

安装扩展后会自动生成消息队列配置文件 ​​config/queue.php​



  1. ​composer require topthink/think-queue​

4. topthink/think-queue 驱动类型


驱动类型

对应的类型值

sync

同步执行, 默认值

database

数据库驱动

redis

Redis驱动 【推荐】

其他自定义的完整的类名


如果驱动类型为 ​​sync​​, 则以下两种发布任务的方式都会同步执行

当驱动类型修改为 ​​redis​​​ 时, ​​think\facade\Queue::later()​​ 才会异步执行


​​// 立即执行​​
​​think\facade\Queue::push($job, $data = '', $queue = null);​​
​​// 延迟执行​​
​​think\facade\Queue::later($delay, $job, $data = '', $queue = null);​​

​​return [​​
​​'default' => 'sync',​​
​​'connections' => [​​
​​'sync' => [​​
​​'type' => 'sync',​​
​​],​​
​​...​​
​​],​​
​​'failed' => [​​
​​'type' => 'none',​​
​​'table' => 'failed_jobs',​​
​​],​​
​​];​​

5. 发布任务


​​// 立即执行​​
​​think\facade\Queue::push($job, $data = '', $queue = null);​​

​​// 延迟执行​​
​​// $delay 延迟时间,单位秒,几秒后执行​​
​​// $job 任务对象​​
​​// $data 自定义数据​​
​​// $queue 队列名称​​
​​think\facade\Queue::later($delay, $job, $data = '', $queue = null);​​

​​/**​​
​​* 获取任务对象​​
​​* 发布任务时使用​​
​​* @param string $class​​
​​* @param string $action​​
​​* @example getJob(\app\queue\Task::class, 'fire')​​
​​* @return string app\queue\task@fire​​
​​*/​​
​​function getJob(string $class, string $action)​​
​​{​​
​​// 使用示例​​
​​// $delay = 10;​​
​​// $job = getJob(\app\queue\Task::class, 'fire');​​
​​// \think\facade\Queue::later($delay, $job, $data);​​
​​return implode('@', [strtolower($class), $action]);​​
​​}​​

6. 监听任务并执行


两种命令


​​php think queue:work​​

​​php think queue:listen​​

两种命令的具体的可选参数可以输入命令加 —help 查看


​​php think queue:work --help​​

​​php think queue:listen --help​​

常用参数


​​// 任务执行五次还未成功, 第六次进入failed方法​​
​​php think queue:listen --tries 5​​