刚接触Hyperf没有多久,就感觉一直和以往FPM的方式不大习惯。老想着打断就die或者exit,引起资源未释放、连接未关闭等问题,并且框架本身也会直接报错。于是想到可以使用 Hyperf 框架提供的 throw new Exception() 抛出一个异常使程序中断模拟以前的 dd() 操作;
1.首先实现一个助手函数,并且注册
需要注意的是,该函数是一个辅助函数,建议在调试时使用,正式环境中应该避免使用。在使用该函数时,应该注意调试信息可能包含敏感数据,需要谨慎处理。
1.在根目录下创建一个 debug_helper.php 文件 文件内容如下
<?php
if (! function_exists('dd')) {
/**
* 该方法主要是使用异常处理对数据进行打断调试 2023-3-14
*
* @param mixed $data
* @return void
*/
function dd($data)
{
if(is_array($data)){
$data = json_encode($data,256);
}
throw new \App\Exception\FmtException((string)$data);
}
}
2.在如下代码中我们可以看到该函数可以接收一个参数 $data 为任意类型,Exception类在强类型下第一个参数必须传递为 string 所以这里如果我传入的是一个数组会自动转成JSON 像 resource 等类型需要自行拓展。
3.以上代码中的FmtException是我自己封装的一个异常处理类,当我在 App\Exception\Handler\AppExceptionHandler 中检测到当前异常属于 FmtException时候 我会做如下处理以方便非JSON数据的输出。
if($throwable instanceof FmtException){
// 如果转JSON成功则输出json 如果为null输出本身
$data = json_decode($throwable->getMessage(),true);
if(!$data){
$data = $throwable->getMessage();
}
return $this->response->fmt($data);
}
4.这里调用了 response 代码如下;本质就是返回了一个json数据
public function __construct(ContainerInterface $container)
{
$this->container = $container;
$this->response = $container->get(ResponseInterface::class);
}
public function fmt(mixed $message){
return $this->response->json($message);
}