参考thinkphp官方文档
thinkphp 6 官方文档
1.下载thinkphp 6作为模板
composer create-project topthink/think 【you project name】 6.0.*
2.安装多应用
2.1 安装扩展
composer require topthink/think-multi-app
2.2修改目录结构
app 应用目录
│ ├─index 主应用
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ ├─route 路由目录
│ │ └─ ... 更多类库目录
│ │
│ ├─admin 后台应用
│ │ └─ ...
3.安装 apidoc ---自动api文档
3.1执行安装命令
composer require hg/apidoc
3.2下载 apidoc ui
参考apidoc文档
apidoc 使用文档
打开浏览器访问 http://你的域名/apidoc/index.html ,出现接口文档页面,表示安装成功
3.3使用
<?php
namespace app\admin\controller;
use app\admin\service\AdminService;
use app\BaseController;
use think\App;
//apidoc 引入
use hg\apidoc\annotation as Apidoc;
/**
* @Apidoc\Title("管理员管理")
*/
class AdminController extends BaseController
{
public function __construct(App $app,AdminService $service)
{
$this->service = $service;
parent::__construct($app);
}
/**
* @Apidoc\Title("基础的接口演示")
* @Apidoc\Tag("基础,示例")
* @Apidoc\Method ("GET")
* @Apidoc\Url ("/admin/adminCurl/adminlist")
* @Apidoc\Query("name", type="string",require=true, desc="姓名",mock="@name")
* @Apidoc\Query("phone", type="string",require=true, desc="手机号",mock="@phone")
* @Apidoc\Returned("id", type="int", desc="Id")
*/
public function getList(){
return json('aaa');
}
}
4.数据库---数据库迁移
4.1安装扩展
composer require topthink/think-migration
4.2创建和使用
//执行命令,创建一个操作文件,一定要用大驼峰写法,如下
php think migrate:create AnyClassNameYouWant
//执行完成后,会在项目根目录多一个database目录,这里面存放类库操作文件
//文件名类似/database/migrations/20190615151716_any_class_name_you_want.php
4.3执行迁移工具
4.3.1执行迁移
php think migrate:run
4.3.2回退迁移
php think migrate:rollback
5.添加JWT - Token验证
5.1安装扩展
composer require firebase/php-jwt
5.2使用创建php JWTtoken.php 用于创建,解析token
<?php
namespace app\tool;
use Exception;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\SignatureInvalidException;
use \Firebase\JWT\JWT;
use Firebase\JWT\Key;
trait JWTtoken
{
/**
* 生成验签
* @param $data
* @return mixed
*/
public function signToken($data)
{
$key = 'abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
$token = array(
"iss" => $key, //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => time(), //签发时间
"nbf" => time(), //在什么时候jwt开始生效
"exp" => time() + 3600, //token 过期时间
"data" => $data //记录的信息
);
$jwt = JWT::encode($token, $key, "HS256"); //生成了 token
return $jwt;
}
/**
* 验证token
* @param $token
* @return array|int[]
*/
public function checkToken($token)
{
$key = 'abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
$res['status'] = false;
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['status'] = 200;
$res['data'] = (array)$arr['data'];
return $res;
} catch (SignatureInvalidException $e) { //签名不正确
$res['message'] = "签名不正确";
return $res;
} catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
$res['message'] = "token失效";
return $res;
} catch (ExpiredException $e) { // token过期
$res['message'] = "token过期";
return $res;
} catch (Exception $e) { //其他错误
$res['message'] = "未知错误";
return $res;
}
}
}
6.中间件
6.1创建中间件--命令
php think make:middleware CheckToken
执行命令会在app/middleware中创建一个CheckToken.php文件
6.2中间件验证token
在创建的中间件文件中编写代码验证token,可以在需要的地方使用
<?php
declare (strict_types=1);
namespace app\middleware;
use app\tool\JWTtoken;
class CheckToken
{
use JWTtoken;
/***
* @param $request
* @param \Closure $next
* @return mixed|\think\response\Json
*/
public function handle($request, \Closure $next)
{
// 获取token
$token = $request->header('X-Token');
// 验证是否存在token
if (empty($token)) {
return json(['msg' => 'token为空', 'code' => '401']);
} else {
// JWT进行校验token
$res = $this->checkToken($token);
// token是否正确
if ($res['status'] != 200) {
return json(['message' => $res['message'], 'code' => '401']);
}
//将解析的数据存入request
$request->userinfo = $res['data'];
}
return $next($request); //返回请求数据本身
}
}
6.2 跨域中间件
执行命令创建一个中间件文件
php think make:middleware AllowCrossDomainMiddleware
编写代码如下
<?php
namespace app\middleware;
use think\middleware\AllowCrossDomain;
class AllowCrossDomainMiddleware extends AllowCrossDomain
{
// 加入自定义请求头参数 X-Token
protected $header = [
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => 1800,
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token',
];
}
在全局中间件配置app/middleware.php 中引入
<?php
// 全局中间件定义文件
use app\middleware\AllowCrossDomainMiddleware;
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
// \think\middleware\SessionInit::class
// \think\middleware\AllowCrossDomain::class,
AllowCrossDomainMiddleware::class
];