# ThinkPHP6 交互
---
## 一、`ThinkPHP6` 容器和依赖注入
* 支持使用依赖注入的场景
> 控制器架构方法
> 控制器操作方法
> 路由的闭包定义
> 事件类的执行方法
> 中间件的执行方法
## 二、`ThinkPHP6` 门面 `Facade`
* 门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个 `facade` 类。
* 系统已经为大部分核心类库定义了 `Facade` ,所以你可以通过 `Facade` 来访问这些系统类,当然也可以为你的应用类库添加静态代理。
## 三、容器和依赖注入、门面
**系统类库**|**容器绑定标识**|**Facade类**
---|---|---
think\\App|app|think\\facade\\App
think\Cache|cache|think\facade\Cache
think\Config|config|think\facade\Config
think\Cookie|cookie|think\facade\Cookie
think\Console|console|
think\Db|db|think\facade\Db
think\Debug|debug|
think\Env|env|think\facade\Env
think\Event|event|think\facade\Event
think\Http|http|
think\Lang|lang|think\facade\Lang
think\Log|log|think\facade\Log
think\Middleware|middleware|think\facade\Middleware
think\Request|request|think\facade\Request
think\Response|response|think\facade\Response
think\Route|route|think\facade\Route
think\Session|session|think\facade\Session
think\Validate|validate|think\facade\Validate
think\View|view|think\facade\View
## 三、案例
> 1、实现前端代码
```
<!DOCTYPE html>
<html>
<head>
<title>管理系统</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
</head>
<body style="padding:30px;">
<table>
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>昵称</th>
<th>性别</th>
<th>头像</th>
<th>状态</th>
<th>最后登录时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
</body>
</html>
```
> 2、代码交互
```php
// php代码
namespace app\index\controller;
use think\View;
use think\facade\Db;
class Index {
public function index(View $view){
$user = Db::table('user')->select();
$view->assign([
'user' => $user
]);
return $view->fetch();
}
}
```
```html
<!DOCTYPE html>
<html>
<head>
<title>管理系统</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
</head>
<body style="padding:30px;">
<table>
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>昵称</th>
<th>性别</th>
<th>头像</th>
<th>状态</th>
<th>最后登录时间</th>
</tr>
</thead>
<tbody>
{foreach $user as $v}
<tr>
<td>{$v['uid']}</td>
<td>{$v['phone']}</td>
<td>{$v['nickname']}</td>
<td>{$v['sex']}</td>
<td>{$v['avatar']}</td>
<td>{$v['status']}</td>
<td>{$v['last_time']}</td>
</tr>
{/foreach}
</tbody>
</table>
</body>
</html>
```
## 四、请求
* 请求对象由 `think\Request` 类负责
> 获取当前请求信息方法
**方法**|**功能**
---|---
host|当前访问域名或者IP
scheme|当前访问协议
port|当前访问的端口
remotePort|当前请求的REMOTE_PORT
protocol|当前请求的SERVER_PROTOCOL
contentType|当前请求的CONTENT_TYPE
domain|当前包含协议的域名
subDomain|当前访问的子域名
panDomain|当前访问的泛域名
rootDomain|当前访问的根域名
url|当前完整URL
baseUrl|当前URL(不含QUERY_STRING)
query|当前请求的QUERY_STRING参数
baseFile|当前执行的文件
root|URL访问根地址
rootUrl|URL访问根目录
pathinfo|当前请求URL的pathinfo信息(含URL后缀)
ext|当前URL的访问后缀
time|获取当前请求的时间
type|当前请求的资源类型
method|当前请求类型
rule|当前请求的路由对象实例
```php
// php代码
namespace app\index\controller;
use think\facade\Request;
class Index {
public function index(){
print_r(Request::host().'<br/>');
print_r(Request::scheme().'<br/>');
print_r(Request::port().'<br/>');
print_r(Request::domain().'<br/>');
}
}
```
> 获取参数方法
**方法**|**功能**
---|---
param|获取当前请求的变量
get|获取 $_GET 变量
post|获取 $_POST 变量
file|获取 $_FILES 变量
put|获取 PUT 变量
delete|获取 DELETE 变量
session|获取 $_SESSION 变量
cookie|获取 $_COOKIE 变量
request|获取 $_REQUEST 变量
server|获取 $_SERVER 变量
env|获取 $_ENV 变量
route|获取 路由(包括PATHINFO) 变量
middleware|获取 中间件赋值/传递的变量
```php
// php代码
namespace app\admin\controller;
use think\Request;
class Index{
// 在index方法引入Request
public function index(Request $request){
// parma 表示接收所有传过来的参数 不管是post请求还是get请求 parma都能接收到参数
$data = $request->param();
// post表示只接收 post方式传出来的参数
$data1= $request->post();
// get表示只接收get方式传出来的参数
$data2= $request->get();
// 假如你只想拿到一个id值,这时我们可以在括号里面加上id即可。
$data = $request->param('id');
}
}
```
> 判断请求类型
**方法**|**功能**
---|---
method|获取当前请求类型
isGet|判断是否GET请求
isPost|判断是否POST请求
isPut|判断是否PUT请求
isDelete|判断是否DELETE请求
isAjax|判断是否AJAX请求
isPjax|判断是否PJAX请求
isJson|判断是否JSON请求
isMobile|判断是否手机访问
isHead|判断是否HEAD请求
isPatch|判断是否PATCH请求
isOptions|判断是否OPTIONS请求
isCli|判断是否为CLI执行
isCgi|判断是否为CGI模式
```php
// php代码
namespace app\index\controller;
use think\facade\Request;
class Index {
public function index(){
var_dump(Request::method());
var_dump(Request::isGet());
var_dump(Request::isPost());
}
}
```
> 获取HTTP头信息
**方法**|**功能**
---|---
header|获取当前请求的HTTP请求头信息
```php
// php代码
namespace app\index\controller;
use think\facade\Request;
class Index {
public function index(){
$info = Request::header();
var_dump($info);
}
}
```
## 五、上传
* 内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要安装额外的扩展
> 单图上传
```php
// php代码
namespace app\index\controller;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
class Index {
public function index(){
return View::fetch();
}
public function upload(){
# image 是input的name
$file = Request::file('image');
if($file==null){
exit(json_encode(array('code'=>1,'msg'=>'没有文件上传')));
}
$info = $file->validate(['ext'=>'jpg,png,gif,jpeg'])->move('./uploads');
if(empty($info)){
exit(json_encode(array('code'=>1,'msg'=>$file->getError())));
}
$img = '/uploads/'.$info->getSaveName();
exit(json_encode(array('code'=>0,'data'=>$img)));
}
}
```
```html
<!DOCTYPE html>
<html>
<head>
<title>上传</title>
</head>
<body>
<form action="index.php/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br>
<input type="submit" value="上传" />
</form>
</body>
</html>
```
> 多图上传
```php
// php代码
namespace app\index\controller;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
class Index {
public function index(){
return View::fetch();
}
public function upload(){
# image 是input的name
$file = Request::file('image');
if($file==null){
exit(json_encode(array('code'=>1,'msg'=>'没有文件上传')));
}
foreach($file as $file_v){
$info = $file_v->validate(['ext'=>'jpg,png,gif,jpeg'])->move('./uploads');
if(empty($info)){
exit(json_encode(array('code'=>1,'msg'=>$file_v->getError())));
}
$img[] = '/uploads/'.$info->getSaveName();
}
exit(json_encode(array('code'=>0,'data'=>$img)));
}
}
```
```html
<!DOCTYPE html>
<html>
<head>
<title>上传</title>
</head>
<body>
<form action="index.php/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /><br>
<input type="file" name="image[]" /><br>
<input type="file" name="image[]" /><br>
<input type="submit" value="上传" />
</form>
</body>
</html>
```
## 六、后台管理案例
* 前端框架使用layui
> php代码
```php
namespace app\index\controller;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
class User {
public function index(){
$get = Request::get();
if(isset($get['wd'])){
if($get['select'] == 'phone'){
$where[] = ['phone','like','%'.$get['wd'].'%'];
}else{
$where[] = ['u_name','like','%'.$get['wd'].'%'];
}
}else{
$where = true;
}
$user = Db::table('user')->where($where)->paginate([
'list_rows' => 5,
'query' => request()->param()
]);
View::assign([
'user' => $user
]);
return View::fetch();
}
public function add(){
if(Request::isPost()){
$post = Request::post();
$post['last_time'] = time();
$add = Db::table('user')->insert($post);
if($add){
exit(json_encode(array('code'=>0,'msg'=>'添加成功')));
}else{
exit(json_encode(array('code'=>1,'msg'=>'添加失败')));
}
}else{
return View::fetch();
}
}
public function edit(){
if(Request::isPost()){
$uid = Request::post('uid');
$post = Request::post();
$post['last_time'] = time();
$edit = Db::table('user')->where('uid',$uid)->update($post);
if($edit){
exit(json_encode(array('code'=>0,'msg'=>'修改成功')));
}else{
exit(json_encode(array('code'=>1,'msg'=>'修改失败')));
}
}else{
$uid = Request::get('uid');
$user = Db::table('user')->where('uid',$uid)->find();
View::assign([
'user' => $user
]);
return View::fetch();
}
}
public function delete(){
$uid = Request::post('uid');
$delete = Db::table('user')->where('uid',$uid)->delete();
if($delete){
exit(json_encode(array('code'=>0,'msg'=>'删除成功')));
}else{
exit(json_encode(array('code'=>1,'msg'=>'删除失败')));
}
}
}
```
> 数据列表页
```html
<!DOCTYPE html>
<html>
<head>
<title>后台管理系统</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
<script src="/static/layui/layui.js"></script>
<style type="text/css">
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #337ab7;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
z-index: 2;
color: #23527c;
background-color: #eee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 3;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #777;
cursor: not-allowed;
background-color: #fff;
border-color: #ddd;
}
</style>
</head>
<body style="padding:30px;">
<div style="margin-top:10px;" class="layui-form">
<div class="layui-form-item layui-form-pane" style="width:800px;">
<div class="layui-input-inline">
<select id="select" lay-filter="aihao">
<option value="phone" {if $select=='phone'?'selected':''}>手机号</option>
<option value="u_name" {if $select=='u_name'?'selected':''}>姓名</option>
</select>
</div>
<input type="text" class="layui-input" style="display:inline-block;width:150px;" id="wd" value="{$wd}" placeholder="输入关键词">
<button class="layui-btn" onclick="searchs()"><i class="layui-icon"></i>搜索</button>
</div>
</div>
<button class="layui-btn" onclick="add()">添加</button>
<table class="layui-table">
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>昵称</th>
<th>性别</th>
<th>头像</th>
<th>状态</th>
<th>最后登录时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach $user as $v}
<tr>
<td>{$v['uid']}</td>
<td>{$v['phone']}</td>
<td>{$v['nickname']}</td>
<td>{$v['sex']}</td>
<td>{$v['avatar']}</td>
<td>{$v['status']}</td>
<td>{$v['last_time']}</td>
<td>
<button class="layui-btn layui-btn-xs" onclick="edit({$v['uid']})">编辑</button>
<button class="layui-btn layui-btn-danger layui-btn-xs" onclick="del({$v['uid']})">删除</button>
</td>
</tr>
{/foreach}
</tbody>
</table>
{$user|raw}
</body>
</html>
<script type="text/javascript">
layui.use(['laypage','layer','form'], function(){
var laypage = layui.laypage;
layer = layui.layer;
$ = layui.jquery;
var form = layui.form;
});
// 添加、编辑
function add(){
layer.open({
type: 2,
title: '添加',
shade: 0.3,
area: ['480px', '450px'],
content:'/index.php/index/User/add'
});
}
// 编辑
function edit(uid){
layer.open({
type: 2,
title: '添加',
shade: 0.3,
area: ['480px', '450px'],
content:'/index.php/index/User/edit?uid='+uid
});
}
// 删除
function del(uid){
layer.confirm('确定要删除吗?', {
btn: ['确定','取消']
}, function(){
$.post('/index.php/index/User/del',{'uid':uid},function(res){
if(res.code>0){
layer.alert(res.msg,{icon:2});
}else{
layer.msg(res.msg);
location.reload();
}
},'json');
});
}
// 搜索
function searchs(page){
var wd = $.trim($('#wd').val());
var select = $.trim($('#select').val());
var url = '/index.php/index/User/index?';
if(wd){
url += '&wd='+wd;
}
if(select){
url += '&select='+select;
}
window.location.href = url;
}
</script>
```
> 添加数据页
```html
<!DOCTYPE html>
<html>
<head>
<title>添加</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
<script src="/static/layui/layui.js"></script>
</head>
<body style="padding:10px;">
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">手机号</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="phone" value="">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">昵称</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="nickname" value="">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">头像</label>
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1">上传图片</button>
<div class="layui-upload-list">
<label class="layui-form-label">图片预览</label>
<img class="layui-upload-img" style="widht:50px;height:50px;" id="img">
<input type="hidden" id="avatar" name="avatar" value="">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">性别</label>
<div class="layui-input-inline">
<select name="sex" lay-filter="aihao">
<option value=""></option>
<option value="0">保密</option>
<option value="1">男</option>
<option value="2">女</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<select name="status" lay-filter="aihao">
<option value=""></option>
<option value="1">开启</option>
<option value="0">关闭</option>
</select>
</div>
</div>
</form>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" onclick="save()">提交</button>
</div>
</div>
<script type="text/javascript">
layui.use(['form','layer','upload'],function(){
var layer = layui.layer;
$ = layui.jquery;
var form = layui.form;
var upload = layui.upload;
var uploadInst = upload.render({
elem: '#test1',
url: "/index.php/index/index/upload",
before: function(obj){
obj.preview(function(index, file, result){
$("#img").attr("src", result);
});
},
done: function(res){
if(res.code > 0){
return layer.msg("上传失败,"+res.msg);
}else{
$("#avatar").val(res.data);
}
}
});
});
function save(){
$.post('/index.php/index/User/add',$('form').serialize(),function(res){
if(res.code>0){
layer.alert(res.msg,{icon:2});
}else{
layer.msg(res.msg);
setTimeout(function(){parent.window.location.reload();},1000);
}
},'json');
}
</script>
</body>
</html>
```
> 数据修改页
```html
<!DOCTYPE html>
<html>
<head>
<title>修改</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
<script src="/static/layui/layui.js"></script>
</head>
<body style="padding:10px;">
<form class="layui-form">
<input type="hidden" name="uid" value="{$user['uid']}">
<div class="layui-form-item">
<label class="layui-form-label">手机号</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="phone" value="{$user['phone']}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">昵称</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="nickname" value="{$user['nickname']}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">头像</label>
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1">上传图片</button>
<div class="layui-upload-list">
<label class="layui-form-label">图片预览</label>
<img class="layui-upload-img" style="widht:50px;height:50px;" src="{$user['avatar']}" id="img">
<input type="hidden" id="avatar" name="avatar" value="{$user['avatar']}">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">年龄</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="age" value="{$user['age']}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">性别</label>
<div class="layui-input-inline">
<select name="sex" lay-filter="aihao">
<option value=""></option>
<option value="0" {$user['sex']==0?'selected':''}>保密</option>
<option value="1" {$user['sex']==1?'selected':''}>男</option>
<option value="2" {$user['sex']==2?'selected':''}>女</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<select name="status" lay-filter="aihao">
<option value=""></option>
<option value="1" {$user['status']==1?'selected':''}>开启</option>
<option value="0" {$user['status']==0?'selected':''}>关闭</option>
</select>
</div>
</div>
</form>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" onclick="save()">提交</button>
</div>
</div>
<script type="text/javascript">
layui.use(['form','layer','upload'],function(){
var layer = layui.layer;
$ = layui.jquery;
var form = layui.form;
var upload = layui.upload;
var uploadInst = upload.render({
elem: '#test1',
url: "/index.php/index/index/upload",
before: function(obj){
obj.preview(function(index, file, result){
$("#img").attr("src", result);
});
},
done: function(res){
if(res.code > 0){
return layer.msg("上传失败,"+res.msg);
}else{
$("#avatar").val(res.data);
}
}
});
});
function save(){
$.post('/index.php/index/User/edit',$('form').serialize(),function(res){
if(res.code>0){
layer.alert(res.msg,{icon:2});
}else{
layer.msg(res.msg);
setTimeout(function(){parent.window.location.reload();},1000);
}
},'json');
}
</script>
</body>
</html>
```
- 序言
- PHP基础
- 认识PHP
- 环境安装
- PHP语法
- 流程控制
- PHP数组
- PHP函数
- PHP类与对象
- PHP命名空间
- PHP7新特性
- PHP方法库
- PHP交互
- 前后端交互
- 项目常规开发流程
- MySQL数据库
- 会话控制
- Ajax分页技术
- 细说函数
- 类与对象
- 对象进阶
- 类与对象进阶
- OOP面向对象
- 设计模式
- 路由与模板引擎
- 异常类
- PHP爬虫
- PHP抓取函数
- PHP匹配函数
- 正则表达式
- PHP字符串函数
- 抓取实战
- PHP接口
- 了解接口
- PHP插件
- PHPSpreadsheet
- ThinkPHP6
- 安装
- 架构
- 数据库
- 数据库操作
- 视图
- 模版
- 模型
- 杂项
- 命令行
- 交互
- 微信小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- 百度小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- Linux
- 服务器上线流程
- 安装svn
- MySQL
- 认识MySQL
- MySQL函数
- 杂项
- composer依赖管理工具