1.创建status.php 用于设置通用的状态码返回枚举类

return[

"success"=>1,

"error"=>0,

"controller_not_found"=>-1,

"action_not_found"=>-2,

];

2.将API返回格式统一封装

/**API 统一格式化

* @param $status

* @param $message

* @param $data

* @param $httpStatus

* @return \think\response\Json

*/

function show($status,$message,$data=[],$httpStatus=200){

$result = [

"status"=>$status,

"message"=>$message,

"data"=>$data,

];

return json($result,$httpStatus);

}

3.重写BaseController中的__call方法

在BaseController中重写__call方法,当调用不存在的方法时,就会调用__call方法,会传入请求方法和参数

declare (strict_types = 1);

namespace app;

use think\App;

use think\exception\ValidateException;

use think\Validate;

/**

* 控制器基础类

*/

abstract class BaseController

{

/**

* Request实例

* @var \think\Request

*/

protected $request;

/**

* 应用实例

* @var \think\App

*/

protected $app;

/**

* 是否批量验证

* @var bool

*/

protected $batchValidate = false;

/**

* 控制器中间件

* @var array

*/

protected $middleware = [];

/**

* 构造方法

* @access public

* @param App $app 应用对象

*/

public function __construct(App $app)

{

$this->app = $app;

$this->request = $this->app->request;

// 控制器初始化

$this->initialize();

}

// 初始化

protected function initialize()

{

}

/**

* 验证数据

* @access protected

* @param array $data 数据

* @param string|array $validate 验证器名或者验证规则数组

* @param array $message 提示信息

* @param bool $batch 是否批量验证

* @return array|string|true

* @throws ValidateException

*/

protected function validate(array $data, string|array $validate, array $message = [], bool $batch = false)

{

if (is_array($validate)) {

$v = new Validate();

$v->rule($validate);

} else {

if (strpos($validate, '.')) {

// 支持场景

[$validate, $scene] = explode('.', $validate);

}

$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);

$v = new $class();

if (!empty($scene)) {

$v->scene($scene);

}

}

$v->message($message);

// 是否批量验证

if ($batch || $this->batchValidate) {

$v->batch(true);

}

return $v->failException(true)->check($data);

}

// 重写__call部分

public function __call(string $name, array $arguments)

{

// TODO: Implement __call() method.

return show(config("status.action_not_found"),"找不到{$name}方法",null,404);

}

}

4.在控制器下面新建Error控制器,然后添加__call方法

在控制器下面新建Error控制器,然后添加__call方法,这样就会调用不存在的控制器的时候会调用__call方法,会传入请求的控制器名称和参数

namespace app\index\controller;

class Error{

public function __call(string $name, array $arguments)

{

// TODO: Implement __call() method.

return show(config("status.controller_not_found"),"找不到{$name}控制器",null,404);

}

}

测试

假定一个成功的请求,测试一下

public function jsonTest(){

$data = ['name' => 'thinkphp', 'status' => '1'];

return show(config("status.success"),"请求成功",$data);

}