乐趣区

关于hyperf:hyperf-框架完善之枚举类和公共函数库连载中

转发自白狼栈:查看原文

明天咱们来看两个问题,枚举类和公众函数库的引入。

枚举类

上节课最初咱们抛出的问题其实就是如何自定义 code 的问题。

为了方便管理错误码,咱们利用 hyperf 的枚举类进行治理。

枚举类参考 https://hyperf.wiki/3.0/#/zh-…

枚举类依赖 hyperf/constants 组件,composer require 进行装置。

composer require hyperf/constants:3.0.*

生成枚举类

php bin/hyperf.php gen:constant ErrorCode

生成好的 ErrorCode 类批改如下:

<?php
declare(strict_types=1);

namespace App\Constants;

use Hyperf\Constants\AbstractConstants;
use Hyperf\Constants\Annotation\Constants;

#[Constants]
class ErrorCode extends AbstractConstants
{
    /**
     * @Message("Server Error!")
     */
    const SERVER_ERROR = 500;

    /**
     * @Message("params.id_invalid")
     */
    const PARAMS_ID_INVALID = 100001;
}

如上,咱们减少了 PARAMS_ID_INVALID=100001 用来定义“id 有效”,能够应用 ErrorCode::getMessage(ErrorCode::PARAMS_ID_INVALID) 来获取对应错误信息。

IndexService::info 批改如下:

use App\Constants\ErrorCode;

public function info(int $id)
{if ($id <= 0) {// throw new BusinessException(trans('params.id_invalid'));
        throw new BusinessException(ErrorCode::getMessage(ErrorCode::PARAMS_ID_INVALID));
    }

    return ['info' => 'data info'];
}

curl 后果如下:

✗ curl http://127.0.0.1:9501/index/info?id=0 --header "lang:ja"
{"code":0,"message":"ID が無効です"}%

ErrorCode::PARAMS_ID_INVALID 的定义间接就反对了国际化,这一点十分敌对。然而并没有扭转 code=0 的现状。

略微优化下 BusinessException 如下:

class BusinessException extends ServerException
{public function __construct(int $code = 0, string $message = null, \Throwable $previous = null)
    {if (is_null($message)) {$message = ErrorCode::getMessage($code);
        }

        parent::__construct($message, $code, $previous);
    }
}

IndexService::info 改写如下:

public function info(int $id)
{if ($id <= 0) {// throw new BusinessException(trans('params.id_invalid'));
        // throw new BusinessException(ErrorCode::getMessage(ErrorCode::PARAMS_ID_INVALID));
        throw new BusinessException(ErrorCode::PARAMS_ID_INVALID);
    }

    return ['info' => 'data info'];
}

curl 测试后果如下:

✗ curl http://127.0.0.1:9501/index/info?id=0 --header "lang:ja"
{"code":100001,"message":"ID が無効です"}%

公共函数库的引入

咱们在 AppExceptionHandler::handle 办法中应用过一个函数,最初一行代码 env(‘APP_ENV’) == ‘dev’。

这里的 env 函数是在 vendor/hyperf/utils/src/Functions.php 文件内定义的。

在这个文件中,hyperf 官网定义了很多函数,在咱们的我的项目中,同样也须要定义一些函数。比方咱们封装一个将字节转化成 KB 或者 MB 的函数 convert_size,总不能去改 hyperf 官网的源码包,在 vendor/hyperf/utils/src/Functions.php 文件内增加吧。

这个很简略,利用 composer 的主动加载机制即可。

app 下创立新的目录文件 app/Utils/Functions.php,内容如下:

<?php

if (! function_exists('convert_size')) {
    /**
     * 将字节转化为 kb mb 等单位
     * @param $size
     * @return string
     */
    function convert_size($size)
    {$unit = ['b', 'kb', 'mb', 'gb', 'tb', 'pb'];
        return @round($size / pow(1024, $i = floor(log($size, 1024))), 2) . ' ' . $unit[$i];
    }
}

批改根目录下的 composer.json 文件中的 autoload 项如下:

"autoload": {
    "psr-4": {"App\": "app/"},
    "files": ["app/Utils/Functions.php"]
},

批改 composer.json 后还须要执行 composer dump-autoload -o 命令。

/data/project/questions # composer dump-autoload -o
Generating optimized autoload files
> rm -rf runtime/container
Generated optimized autoload files containing 3132 classes

改写 IndexController::info 办法:

#[AutoController]
class IndexController extends AbstractController
{public function info()
    {return convert_size(memory_get_usage(true));
    }
}

curl 后果:

✗ curl 127.0.0.1:9501/index/info
8 mb%

至此,框架的根本构造咱们就欠缺的差不多了,下节课咱们补充一些 swoole 协程方面的常识。

退出移动版