枚举类

当您需要定义错误码和错误信息时,可能会使用以下方式,

  1. <?php
  2. class ErrorCode
  3. {
  4. const SERVER_ERROR = 500;
  5. const PARAMS_INVALID = 1000;
  6. public static $messages = [
  7. self::SERVER_ERROR => 'Server Error',
  8. self::PARAMS_INVALID => '参数非法'
  9. ];
  10. }
  11. $message = ErrorCode::messages[ErrorCode::SERVER_ERROR] ?? '未知错误';

但这种实现方式并不友好,每当要查询错误码与对应错误信息时,都要在当前 Class 中搜索两次,所以框架提供了基于注解的枚举类。

安装

  1. composer require hyperf/constants

使用

定义枚举类

通过 gen:constant 命令可以快速的生成一个枚举类。

  1. php bin/hyperf.php gen:constant ErrorCode
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Constants;
  4. use Hyperf\Constants\AbstractConstants;
  5. use Hyperf\Constants\Annotation\Constants;
  6. #[Constants]
  7. class ErrorCode extends AbstractConstants
  8. {
  9. /**
  10. * @Message("Server Error!")
  11. */
  12. const SERVER_ERROR = 500;
  13. /**
  14. * @Message("系统参数错误")
  15. */
  16. const SYSTEM_INVALID = 700;
  17. }

用户可以使用 ErrorCode::getMessage(ErrorCode::SERVER_ERROR) 来获取对应错误信息。

定义异常类

如果单纯使用 枚举类,在异常处理的时候,还是不够方便。所以我们需要自己定义异常类 BusinessException,当有异常进来,会根据错误码主动查询对应错误信息。

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Exception;
  4. use App\Constants\ErrorCode;
  5. use Hyperf\Server\Exception\ServerException;
  6. use Throwable;
  7. class BusinessException extends ServerException
  8. {
  9. public function __construct(int $code = 0, string $message = null, Throwable $previous = null)
  10. {
  11. if (is_null($message)) {
  12. $message = ErrorCode::getMessage($code);
  13. }
  14. parent::__construct($message, $code, $previous);
  15. }
  16. }

抛出异常

完成上面两步,就可以在业务逻辑中,抛出对应异常了。

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller;
  4. use App\Constants\ErrorCode;
  5. use App\Exception\BusinessException;
  6. class IndexController extends AbstractController
  7. {
  8. public function index()
  9. {
  10. throw new BusinessException(ErrorCode::SERVER_ERROR);
  11. }
  12. }

可变参数

在使用 ErrorCode::getMessage(ErrorCode::SERVER_ERROR) 来获取对应错误信息时,我们也可以传入可变参数,进行错误信息组合。比如以下情况

  1. <?php
  2. use Hyperf\Constants\AbstractConstants;
  3. use Hyperf\Constants\Annotation\Constants;
  4. #[Constants]
  5. class ErrorCode extends AbstractConstants
  6. {
  7. /**
  8. * @Message("Params %s is invalid.")
  9. */
  10. const PARAMS_INVALID = 1000;
  11. }
  12. $message = ErrorCode::getMessage(ErrorCode::PARAMS_INVALID, ['user_id']);
  13. // 1.2 版本以下 可以使用以下方式,但会在 1.2 版本移除
  14. $message = ErrorCode::getMessage(ErrorCode::PARAMS_INVALID, 'user_id');

国际化

该功能仅在 v1.1.13 及往后的版本上可用

要使 hyperf/constants 组件支持国际化,就必须要安装 hyperf/translation 组件并配置好语言文件,如下:

  1. composer require hyperf/translation

相关配置详见 国际化

  1. <?php
  2. // 国际化配置
  3. return [
  4. 'params.invalid' => 'Params :param is invalid.',
  5. ];
  6. use Hyperf\Constants\AbstractConstants;
  7. use Hyperf\Constants\Annotation\Constants;
  8. #[Constants]
  9. class ErrorCode extends AbstractConstants
  10. {
  11. /**
  12. * @Message("params.invalid")
  13. */
  14. const PARAMS_INVALID = 1000;
  15. }
  16. $message = ErrorCode::getMessage(ErrorCode::SERVER_ERROR, ['param' => 'user_id']);