现在我们有一个 Banner.php 文件。
我们先来看一下这个接口的多级目录与命名空间:
接口的文件目录
由于这里需要一个 v1 文件夹来表示版本号,所以控制器的 php 文件并不是直接位于 controller 文件夹下的。
<?php
namespace app\api\controller\v1;
class Banner
{
/**
* @url /banner/:id
* @http GET
* @id banner的id号
*/
public function getBanner($id){
}
}
根据 @url 中写的:/banner/:id
接下来,我们配置一下路由文件,可能首先我们会这样掉进坑里:
use think\Route;
Route::get("banner/:id","api/controller/v1/Banner/getBanner");
然后一用 Postman 验证一下就会发现:
postman 显示模块不存在(z.cn是虚拟域名)
上面的方式肯定是错误的,tp5中路径不是和命名空间一个写法的,它有自己的规范。根据三段式(模块/控制器/操作方法名)的要求,我们之后可能会这样掉入坑里:
Route::get("banner/:id","api/Banner/getBanner");
乍一看仿佛是没有问题的,api 是模块,Banner 是控制器,getBanner 是其操作方法名。但一运行:
控制器不存在
其实上面的做法忽略了 v1 目录,这种时候控制器有多级目录,而 Banner 控制器不是直接位于 controller 文件夹下,而是位于子目录 v1 下面。tp5 规定这种情况下需要 v1.Banner 进行访问。
Route::get("banner/:id","api/v1.Banner/getBanner");
这种设计也是有道理的,因为控制器这里一定不能传入其命名空间,而要要三段式。
api/v1.Banner/getBanner(成功)
网友评论