记录一下TP5.1多应用多版本管理路由设计及文档解决方案!
首先,不要问TP6的解决方案,本篇文章提供的方案已经测试过了在TP6上是不可用的!请知悉!在开始之前,请确保你和我的需求一致,如果不一致请勿修改!
注意事项
本博文内提到的所有“TP5”都是指“TP5.1”,而不是“TP5.0”!
我的需求
- 多应用管理(TP5默认就是多应用,TP6需要装个包,不麻烦)
- 多版本(TP5研究出来了,TP6翻了一圈貌似需要改源码,不考虑!)
- 文档生成工具是:ThinkPHP-Apidoc,见:https://hg-code.gitee.io/thinkphp-apidoc/
- API项目,前后端分离(这个貌似就是很基础的,不可能不支持的)
需求说明
- 多应用就不说了,我一个辣鸡前端都知道啥意思,各位后端大佬不可能不知道吧?
- 多版本意思就是我希望接口有版本区分,如:
admin/v1/account/login
、admin/v2/account/login
,这样做的目的是增加灵活性并且最大程度上保证向下兼容,不可能说系统迭代,老接口全部废弃,这太煞笔了;
如何实现
多应用跳过,TP5默认就是多应用!主要这篇博文是说一下,如果开启多版本能力;我的目的结构如下:
打开 config/app.php
文件,修改 controller_auto_search
为 true
其实到这一步就算完成了,简单吧,但很显然,既然我都要管理版本,向下兼容了,既然认认真真搞接口,那不得搞个文档?然后apidoc在tp5下还有坑,我也给大家整理出来了!
坑1:不能用app
配置应用路径的时候得用 application
!不能使用 app
,虽然不会报错但是会找不到你写的任何接口!
坑2:路径问题
默认转小写配置貌似是整个 $class
的首字母大小写调整,这不符合我的需求,所以可以使用 custom
来自定义路径!这里我将控制器的首字母变成了小写(默认是大写!)
<?php
return [
"auto_url" => [
// 自定义URL规则
"custom" => function ($class, $method) {
$paths = explode("\\", $class);
$url = [];
foreach ($paths as $index => $path) {
if (!in_array($path, ["app", "controller"])) {
$path = preg_replace("/([A-Z])/", "_$1", lcfirst($path));
array_push($url, strtolower($path));
}
}
array_push($url, $method);
return "/" . implode("/", $url);
}
]
];