顶呱呱多商户
🏠 首页
序言
系统简介
前端脑图
项目介绍
功能清单
更新记录
多商户v2.0.0(20220525)
多商户v2.0.1(20220622)
多商户v2.0.2(20220901)
多商户v2.0.3(20221026)
多商户v2.1.0(20230209)
多商户v2.1.1(20230406)
多商户v2.2(20230626)
多商户v2.2.1(20230914)
多商户v2.2.2(20231114)
多商户v2.3.0(20240125)
多商户v2.3.1(20240228)
多商户v2.3.2(20240521)
安装指南
准备工作
服务器购买
服务器配置
阿里云
腾讯云
京东云
SSL证书
注意事项
宝塔证书
阿里云证书
腾讯云证书
配置HTTPS
安装搭建
运行环境
1.站点创建
2.上传源码
3.环境配置
4.反向代理
5.守护进程
6.安装
视频安装教程
注意事项(很重要)
重启swoole服务
linux安装swoole方法
特别注意事项
mysql 5.7注意事项
基础配置
商城配置
公众号配置
跳转网页
公众号配置
公众号开发配置
公众号菜单
设置公众号菜单
关键字
跳转小程序
传域名校验证书
小程序配置
公众平台配置
后台配置
支付配置
微信V2支付
微信V3支付
支付宝支付
发布小程序
源码打包发行
后台下载发行
确认发布
基础配置完成
新手入门
版本更新
旧版本更新流程
自动更新(1.4及以上版本)
打包H5/公众号
部署多套多商户
技术文档
开发规范
数据字典
目录结构
移动端路由
系统配置
后台表单说明
APP打包
基础配置
开发调试
打包上线
App打包
隐私政策
清除缓存
自定义命令
开启热更新
微信开放平台
容器部署
使用说明
商品管理
虚拟商品
卡密商品
商品分类
平台商品分类
品牌分类
品牌分类
商品标签
发布商品
商品规格
商品采集
保障服务
移动端商品管理
开启移动端商品管理
功能说明
商品推荐
商品口令
商品参数
价格说明
商品详情
热销排行
分销管理
分销配置
分销员管理
分销规则说明
分销员等级
分销礼包
佣金说明
提现
提现规则
提现步骤
商家到零钱
分销订单
用户管理
用户反馈
商户用户管理
平台用户管理
用户协议
用户搜索记录
订单管理
后台订单
移动端订单
订单退款
订单打印
电子面单v2
客服管理
商家客服
添加客服
自动回复
平台客服
开启客服
自动回复
商户管理
商户入驻
商户列表
商户菜单管理
商户详情
财务管理
财务对账
发票管理
自动分账
店铺管理
开启店铺
店铺信息
店铺类型
店铺保证金
店铺配置
店铺街
店铺活动
门店自提
开启门店自提
设置核销权限
订单核销说明
店铺装修
一号通
一号通注册
一号通配置
电子面单
短信提醒
商品采集
物流查询
商户一号通
社区功能
社区分类
社区话题
社区内容
社区评论
社区配置
小程序配置
1. 小程序下载并提交审核
2. 确认发布
3.小程序直播配置
商城装修
商城装修
主题风格
页面设置
自定义链接
店铺模板
素材管理
系统表单
同城配送
账号注册
达达
UU
同城配送
消息管理
模板消息
公众号模板消息
小程序订阅消息
消息管理
公告管理
阿里云短信
后台消息
营销活动
秒杀
v2.3.1及以前版本秒杀规则
开启秒杀活动
最新版本活动说明
最新版本秒杀活动
直播
主播实名认证
开启直播
添加直播商品
预售
开启全款预售
开启定金预售
预售协议
专题
后台配置
前端展示
助力
开启助力
查看助力活动
拼团
虚拟拼团设置
开启拼团
查看拼团活动
积分
积分设置
积分来源
积分使用
优惠券
平台优惠券
商户优惠券
优惠套餐
平台后台
商户后台
活动氛围图
活动边框图
活动报名
商城设置
数据大屏
储存管理
基础设置
七牛云
阿里云
腾讯云
华为云
UC存储
京东云
天翼云
运费设置
运费组成
运费模板
物流配置
小票打印
协议与规则
飞鹅云配置
会员管理
等级用户
等级管理
等级权益
等级配置
付费会员
平台后台设置
商户后台设置
积分商城
积分商城设置
积分商品
积分订单
开放接口
账号管理
商家主动退款
商户后台退款
移动端退款
移动端说明
目录结构
配置说明
页面路径
首页无DIY二开说明
后台前端说明
总后台目录结构
商户后台目录结构
开发和构建
PC端说明
安装教程
目录结构
打包教程
PC端SEO安装
常见问题
服务器问题
服务器环境说明
MySQL 5.7注意事项
PHP fileinfo扩展安装
扩展安装不生效如何处理?
如何切换PHP版本
PHP Fatal error: Namespace declaration报错如何解决
多商户安装问题
前后端分离配置
前端代码如何重新上传?
前端源码位置在哪?
小程序直播插件未授权怎么处理?
如何使用IP部署项目?
swoole端口号被占用怎么处理?
报错 NOAUTH Authentication required. 如何解决
语法错误:unexpected 'c' (T_STING)如何处理
【检查php/swoole/swoole_loader版本】的方法
【网站打开乱码】解决办法
多商户使用问题
上传图片不显示如何处理?
如何在宝塔中使用命令行执行命令?
如何修改项目swoole运行端口
swoole 或 queue服务无法启动如何排查
清空数据
后台登录页幻灯片如何修改
后台登录页logo如何设置
个人中心菜单加链接
子账号登录名
如何重启swoole进程
导出文件无法导出如何处理?
搜索商品后服务挂了如何处理
安装完成后台下载小程序报404
商品上/下架用户端商品不起作用
授权失败如何处理
前端代码打包后怎么放到服务器
如何设置跳转链接?
测试域名如何使用?
修改代码如何配置热更新?
进入商户提示没有访问权限如何解决?
多商户平台后台的管理员密码忘了如何处理
客服聊天链接失败如何处理
消息管理同步报错tid does not exit rid 报错如何处理
如何更换加密文件
支付提示当前页面URL链接未注册
小程序打开空白的问题处理
加密文件丢失如何处理
支付宝报错 implode():Passing….】的解决方法
小程序图片不显示或海报不能生成
如何开启Debug
如何查看接口报错信息
登录子商户报没有权限登录,如何解决?
验证码刷新不变
前端打包教程
如何快速找到后台菜单栏
输入源"/body/xml/appid"映射到字段公众号..
小程序超包的分包方法
阿里云发送短信 params must be [a-zA-Z0-9] for verificatio
模板不存在:APPLY_MER_SUCCESS
授权失效
安装过程提示系统错误
提示‘某某读取了你的剪切板内容
各版本问题汇总
以前版本问题
最新版本问题
小程序提示插件未授权
开发文档
架构
config配置文件
容器和依赖注入
异常处理
路由
控制器模块
日志处理
自定义指令
预留事件
订单
微信
商品
用户
订单退款
后台管理
种草社区
类库
Basic基类
Exceptions异常处理
Interfaces接口类
Jobs消息队列
services服务类
traits
listens定时监听类
接口流程
Controller
Repository
Dao
Model
流程
订单流程
订单流程
退款流程
二开教程
定义新的接口
创建新的页面
创建新的组合数据
更换短信模板
新增模板消息
商业授权
授权说明
申请授权
测试域名
去版权服务
搜索结果
没有相关内容~~
容器和依赖注入
最新修改于
2024-08-27 17:47
## 容器和依赖注入 ThinkPHP使用容器来更方便的管理类依赖及运行依赖注入,新版的容器支持 `PSR-11`规范。 > 容器类的工作由 `think\Container`类完成,但大多数情况我们只需要通过 `app`助手函数或者 `think\App`类即可容器操作,如果在服务类中可以直接调用 `this->app`进行容器操作。 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。 ``` <?php namespace app\controller; use think\Request; class Index { protected $request; protected $services; public function __construct(Request $request,TestServices $services) { $this->request = $request; $this->services = $services; } public function hello($name) { return 'Hello,' . $name . '!This is '. $this->request->action(); } } ``` 支持使用依赖注入的场景包括(但不限于): * 控制器架构方法; * 控制器操作方法; * 路由的闭包定义; * 事件类的执行方法; * 中间件的执行方法; 对于自定义的类以及方法,如果需要使用依赖注入,需要使用系统提供的 `invoke`助手函数调用,例如: class Foo { public function __construct(Bar $bar) { }} 如果直接 `new`的话,需要手动传入 `Bar`对象实例 $bar = new Bar(); $foo = new Foo($bar); 如果使用容器来实例化的话,可以自动进行依赖注入。 $foo = invoke('Foo'); 如果要对某个方法支持依赖注入,可以使用 class Foo { public function bar(Bar $bar) { // ... }} $result = invoke(['Foo', 'bar']); 也支持对某个函数或者闭包使用依赖注入 $result = invoke(function(Bar $bar) { // ...}); ## 绑定 依赖注入的类统一由容器进行管理,**大多数情况下是在自动绑定并且实例化的**。不过你可以随时进行手动绑定类到容器中(通常是在服务类的 `register`方法中进行绑定),支持多种绑定方式。 ### 绑定类标识 可以对已有的类库绑定一个标识(唯一),便于快速调用。 ``` // 绑定类库标识 $this->app->bind('think\Cache', 'app\common\Cache'); ``` 或者使用助手函数 ``` // 绑定类库标识 bind('cache', 'think\Cache'); ``` > 绑定的类标识可以自己定义(只要不冲突)。 ### 绑定闭包 可以绑定一个闭包到容器中 ``` bind('sayHello', function ($name) { return 'hello,' . $name; }); ``` ### 绑定实例 也可以直接绑定一个类的实例 ``` $cache = new think\Cache; // 绑定类实例 bind('cache', $cache); ``` ### 绑定至接口实现 对于依赖注入使用接口类的情况,我们需要告诉系统使用哪个具体的接口实现类来进行注入,这个使用可以把某个类绑定到接口 ``` // 绑定think\LoggerInterface接口实现到think\Log bind('think\LoggerInterface','think\Log'); ``` 使用接口作为依赖注入的类型 ``` <?php namespace app\index\controller; use think\LoggerInterface; class Index { public function hello(LoggerInterface $log) { $log->record('hello,world!'); } } ``` ### 批量绑定 在实际应用开发过程,不需要手动绑定,我们只需要在 `app`目录下面定义 `provider.php`文件(只能在全局定义,不支持应用单独定义),系统会自动批量绑定类库到容器中。 ``` return [ 'route' => \think\Route::class, 'session' => \think\Session::class, 'url' => \think\Url::class, ]; ``` 系统内置绑定到容器中的类库包括 | 系统类库 | 容器绑定标识 | | ----------------- | ------------ | | think\\App | app | | think\\Cache | cache | | think\\Config | config | | think\\Cookie | cookie | | think\\Console | console | | think\\Db | db | | think\\Debug | debug | | think\\Env | env | | think\\Event | event | | think\\Http | http | | think\\Lang | lang | | think\\Log | log | | think\\Middleware | middleware | | think\\Request | request | | think\\Response | response | | think\\Filesystem | filesystem | | think\\Route | route | | think\\Session | session | | think\\Validate | validate | | think\\View | view | ## 解析 使用 `app`助手函数进行容器中的类解析调用,对于已经绑定的类标识,会自动快速实例化 ``` $cache = app('cache'); ``` 带参数实例化调用 ``` $cache = app('cache',['file']); ``` 对于没有绑定的类,也可以直接解析 ``` $arrayItem = app('org\utils\ArrayItem'); ``` 容器中已经调用过的类会自动使用单例,除非你使用下面的方式强制重新实例化。 ``` // 每次调用都会重新实例化 $cache = app('cache', [], true); ``` ## 对象化调用 使用 `app`助手函数获取容器中的对象实例(支持依赖注入)。 ``` $app = app(); // 判断对象实例是否存在 isset($app->cache); // 注册容器对象实例 $app->cache = think\Cache::class; // 获取容器中的对象实例 $cache = $app->cache; ``` 也就是说,你可以在任何地方使用 `app()`方法调用容器中的任何类,但大多数情况下面,我们更建议使用依赖注入。 ``` // 调用配置类 app()->config->get('app_name'); // 调用session类 app()->session->get('user_name'); ``` ## 自动注入 容器主要用于依赖注入,依赖注入会首先检查容器中是否注册过该对象实例,如果没有就会自动实例化,然后自动注入,例如: 我们可以给路由绑定模型对象实例 ``` Route::get('user/:id','index/Index/hello') ->model('\app\index\model\User'); ``` 然后在操作方法中自动注入User模型 ``` <?php namespace app\index\controller; use app\index\model\User; class Index { public function hello(User $user) { return 'Hello,'.$user->name; } } ``` ## 自定义实例化 容器中的对象实例化支持自定义,可以在你需要依赖注入的对象中增加 `__make`方法定义,例如: 如果你希望 `User`模型类在依赖注入的时候 使用自定义实例化的方式,可以用下面的方法。 ``` <?php namespace app\index\model; use think\Model; use think\db\Query; class User extends Model { public static function __make(Query $query) { return (new self())->setQuery($query); } } ``` ## 容器对象回调机制 容器中的对象实例化之后,支持回调机制,利用该机制可以实现诸如注解功能等相关功能。 你可以通过 `resolving`方法注册一个全局回调 ``` Container::getInstance()->resolving(function($instance,$container) { // ... }); ``` 回调方法支持两个参数,第一个参数是容器对象实例,第二个参数是容器实例本身。 或者单独注册一个某个容器对象的回调 ``` Container::getInstance()->resolving(\think\Cache::class,function($instance,$container) { // ... }); ```
请输入访问密码
开始访问