net.christianto / apikit-ci4
CodeIgniter 4 的 API 工具包。帮助API项目代码更整洁。
Requires (Dev)
- chez14/phpcs: ^1.0
- codeigniter4/framework: ^4.3
- squizlabs/php_codesniffer: ^3.7
README
通过允许抛出 ApiException 作为早期退出,帮助代码更整洁。
这个我称之为“工具包”的包,通过允许代码通过抛出 ApiException 早期退出,来提高代码的整洁性。在 CodeIgniter 4.4(截至现在尚未发布)中,用户定义的异常处理程序适用于整个项目,这可能会对处理 API 请求的路由造成问题。
在浏览器中查看时,这些错误以 HTML 格式显示,尽管在 XHTML 请求下它作为 JSON 提供,但我们仍然希望在浏览器中查看时以 JSON 格式显示。另一个问题是,返回的字段与 ResponseTraits
从 API
命名空间不一致。
“工具包”通过提供使用 ApiException
作为早期退出的简单方法,来使代码更整洁,从而改进了 CodeIgniter 4.4 中 API 路由的异常处理,其中用户定义的异常处理程序适用于整个项目。
用法
通过 Composer 安装它
composer require net.christianto/apikit-ci4
将过滤器添加到您的 API 路由中。这将捕获您抛出的所有 API 异常。
// app/Config/Routes.php $routes->get('/-/ping', 'Api\Pinger::index', ['filter' => 'api_exception_catch']);
在您的控制器中,当您想报告错误时,只需抛出任何
ApiException
。ApiExceptionCatcher
将自动将您的错误与相应的错误消息屏幕正确显示。// app/Controllers/Api/Pinger.php namespace App\Controllers\Api; use App\Controllers\BaseController; use CHEZ14\ApiKit\Exceptions\ApiException; use CodeIgniter\API\ResponseTrait; class Pinger extends BaseController { use ResponseTrait; public function index() { $request = request(); if ($request->getGet('id') != '405') { throw new ApiException("I cannot understand that.", 400); } return $this->respond([ "status" => true, "message" => "I'm 99!" ], 200); } }
请注意,我们只捕获 ApiException
异常实例。任何其他异常都将抛给框架。
例如,请查看以下片段
public function index()
{
$request = request();
if ($request->getGet('id') != '405') {
throw new InvalidArgumentException("I cannot understand that.", 400);
}
return $this->respond([
"status" => true,
"message" => "I'm 99!"
], 200);
}
InvalidArgumentException
不会被 api_exception_catch
过滤器捕获,因为它不是 ApiException
的实例。因此,它将被直接转发到框架的默认异常处理程序,无论它是什么。
我相信将某些异常视为有效的、有意的 API 结果,应该是可选的。捕获所有异常并将它们重新格式化为 API 结果是不可取的,因为我们无法区分这些错误是否是预期的逻辑,或者 PHP 告诉我们我们在做错事。
许可
MIT.