tp6.0开发初始化
安装tp6:https://www.kancloud.cn/manual/thinkphp6_0/1037481
一、配置
1、开启调试
2、强制路由
3、数据库
二、定义公共返回数据方法
// 抛出异常
function ApiException($msg = '请求错误', $errorCode = 20000, $statusCode = 404){
// 框架提供抛出异常的助手函数
abort($errorCode, $msg, ['statusCode' => $statusCode]);
}
// 成功返回
function showResCode($data = '',$msg = 'ok',$code = 200){
return json(['msg' => $msg, 'data' => $data],$code);
}
// 返回不带数据
function showResWithoutCode($msg = '', $code = 200){
return showResCode([], $msg, $code);
}
控制器里使用公共方法
三、自定义异常
if (env('APP_DEBUG')) {
// 其他错误交给系统处理
return parent::render($request, $e);
}
$headers = $e->getHeaders();
return json([
'msg' => $e->getMessage(),
'errorCode' => $e->getStatusCode()
],array_key_exists('statusCode',$headers)
// 响应码404
? $headers['statusCode'] : 404);
控制器抛出异常
结果
四、自动实例化模型
我们将模型实例保存在$M变量中,继承Base的控制器通过$this->M拿到模型实例。
若不想自动实例化模型,继承Base的控制器配置$autoNewModel = false即可。
- 控制器和模型需要子目录相同:比如控制器
controller\v1
模型model\v1
- 模型名和控制器名一样
<?php
namespace app;
use app\BaseController;
class Base extends BaseController{
// 是否自动实例化当前模型
protected $autoNewModel = true;
// 自定义实例化模型路径
protected $ModelPath = null;
// 保存当前模型实例
protected $M = null;
public function __construct(Request $request){
// 初始化控制器相关信息
$this->initControllerInfo($request);
// 实例化当前模型
$this->getCurrentModel();
// 当前控制器信息
protected $Cinfo = [];
}
// 初始化控制器相关信息
public function initControllerInfo($request){
// $str = 'v1.Index'
$str = $request->controller();
// 获取真实控制器名称
$this->Cinfo = [
// 助手函数:获取类名(不包含命名空间)
'Cname' => class_basename($this),
'Cpath' => str_replace('.','\\',$str),
// 当前方法
'action' => $request->action()
];
/**
* "Cname" => "User"
* "Cpath" => "v1\User"
* "action" => "index"
*/
}
// 获取当前模型实例
public function getCurrentModel(){
if (!$this->M && $this->autoNewModel) {
$model = $this->ModelPath ?? $this->Cinfo['Cpath'];
$this->M = app('app\model\\'.$model);
}
}
}
继承base
结果
五、验证器自动化验证
验证器:https://www.kancloud.cn/manual/thinkphp6_0/1037624
php think make:validate v1/Index
- $autoValidateCheck = true;是否开启自动验证
- $excludeValidateCheck = [];不需要验证的方法
- protected $autoValidateScenes = []; 验证场景配置; [方法名=>场景名] ,若没有配置,默认scene为方法名。
注意:
- 验证器、控制器和模型需要子目录相同:比如控制器
controller\v1
模型model\v1
验证器validate\v1
- 验证器、模型名和控制器名一样
- 因为我们通过$request->controller();(得到的结果例如:v1.Index)拿到控制器名,同时以此名字作为模型名和验证器名。
base添加
1、成员变量
// 是否开启自动验证
protected $autoValidateCheck = true;
// 不需要验证的方法
protected $excludeValidateCheck = [];
// 验证场景配置
protected $autoValidateScenes = [];
2、构造添加
// 自动验证
$this->autoValidateAction();
3、成员方法
// 自动化验证
public function autoValidateAction(){
// app地址
define('__APP_PATH__',__DIR__.'\\');
// 当前方法
$action = $this->Cinfo['action'];
// 判断是否需要验证,不在排除方法中
if ($this->autoValidateCheck && !in_array($action,$this->excludeValidateCheck)) {
// 获取验证实例
$validateName = file_exists(__APP_PATH__.'validate/'.$this->Cinfo['Cpath'].'.php') ? $this->Cinfo['Cpath'] : $this->Cinfo['Cname'];
$validate = app('app\validate\\'.$validateName);
// 获取验证场景
$scene = $action;
// autoValidateScenes = [Index => scene] 方法名 => 场景名
if (array_key_exists($action,$this->autoValidateScenes)) {
$scene = $this->autoValidateScenes[$action];
}
// 没有配置autoValidateScenes,默认scene为方法名
// 开始验证
$params = request()->param();
if (!$validate->scene($scene)->check($params)) {
// 抛出异常
ApiException($validate->getError());
}
}
}
1
1
1
1
1
1
1
1
1
1