tp5 自定义控制器多级目录

2018-08-21  本文已影响1510人  风声233

现在我们有一个 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(成功)
上一篇 下一篇

猜你喜欢

热点阅读