在使用 PHP 开发 API 时,经常会遇到需要返回错误信息的场景。前端根据返回的错误码,再进行相应的操作。
发现问题
这里用 ThinkPHP8 举个例子,这是一个用户登录接口的例子:
public function login()
{
$username = $this->request->param('username');
$password = $this->request->param('password');
if (!$username || !$password) {
$result = ['code' => 1001, 'msg' => '参数不完整'];
} else if ($username !== 'admin') {
$result = ['code' => 1002, 'msg' => '用户不存在'];
} else if ($password !== '123456') {
$result = ['code' => 1003, 'msg' => '密码错误'];
} else {
$result = ['code' => 1, 'msg' => '登录成功'];
}
return json($result);
}
上面的代码里,对提交的参数进行一些简单的判断,定义了 $result 数组,并为每个不同的错误都提供了一个错误码和提示信息。最后返回给前端。为了让前端能理解错误码,后端开发人员需要把上面的 code 和 msg 都写在 api 文档的错误码里,以供前端参考。
不过大家是否觉得这种直接在代码里零散地写 code 和 msg 不够直观和优雅(在实际开发过程中,不大可能会如此集中地显示错误信息),而且容易不小心把 code 写错或者重复?或许我们可以换一种方式来表达错误码。
解决方案
我先把调整后的代码贴出:
public function login()
{
$username = $this->request->param('username');
$password = $this->request->param('password');
if (!$username || !$password) {
$status = LoginStatus::PARAM_INCOMPLETE;
} else if ($username !== 'admin') {
$status = LoginStatus::USER_NOT_FOUND;
} else if ($password !== '123456') {
$status = LoginStatus::PASSWORD_WRONG;
} else {
$status = LoginStatus::SUCCESS;
}
return json($status->apiResult());
}
上面代码没有了 code 和 msg 信息,但是却不难理解 $status 所表达的含义,让代码看上去清爽、直观很多。
Continue reading →