hyperf/docs/en/constants.md
李铭昕 b867aa2647
Release v3.1.8 (#6515)
Co-authored-by: Sharif <54396379+developersharif@users.noreply.github.com>
Co-authored-by: guandeng <guandeng@Hotmail.com>
Co-authored-by: Luffy <52o@qq52o.cn>
2024-02-01 10:18:57 +08:00

4.1 KiB

Enum class

When you need to define error codes and error messages, the following methods may be used,

<?php

class ErrorCode
{
    const SERVER_ERROR = 500;
    const PARAMS_INVALID = 1000;

    public static $messages = [
        self::SERVER_ERROR => 'Server Error',
        self::PARAMS_INVALID => 'Illegal parameter'
    ];
}

$message = ErrorCode::messages[ErrorCode::SERVER_ERROR] ?? 'unknown mistake';

But this implementation method is not friendly. Whenever you want to query the error code and the corresponding error information, you have to search the current Class twice, so the framework provides an annotation-based enumeration class.

Install

composer require hyperf/constants

Use

Define the enum class

An enumeration class can be generated quickly with the gen:constant command.

php bin/hyperf.php gen:constant 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("System parameter error")
     */
    const SYSTEM_INVALID = 700;
}

User can use ErrorCode::getMessage(ErrorCode::SERVER_ERROR) to get the corresponding error message.

Define exception class

If you simply use the enumeration class, it is not convenient enough when handling exceptions. So we need to define our own exception class BusinessException. When an exception comes in, it will actively query the corresponding error information according to the error code.

<?php

declare(strict_types=1);

namespace App\Exception;

use App\Constants\ErrorCode;
use Hyperf\Server\Exception\ServerException;
use Throwable;

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);
    }
}

Throw an exception

After completing the above two steps, the corresponding exception can be thrown in the business logic.

<?php

declare(strict_types=1);

namespace App\Controller;

use App\Constants\ErrorCode;
use App\Exception\BusinessException;

class IndexController extends AbstractController
{
    public function index()
    {
        throw new BusinessException(ErrorCode::SERVER_ERROR);
    }
}

Variable parameter

When using ErrorCode::getMessage(ErrorCode::SERVER_ERROR) to get the corresponding error message, we can also pass in variable parameters to combine error messages. For example the following

<?php

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

#[Constants]
class ErrorCode extends AbstractConstants
{
    /**
     * @Message("Params %s is invalid.")
     */
    const PARAMS_INVALID = 1000;
}

$message = ErrorCode::getMessage(ErrorCode::PARAMS_INVALID, ['user_id']);

// 1.2 Below version The following methods can be used, but will be removed in version 1.2
$message = ErrorCode::getMessage(ErrorCode::PARAMS_INVALID, 'user_id');

Globalization

This feature is only available on v1.1.13 and later

To enable the hyperf/constants component to support internationalization, the hyperf/translation component must be installed and configured Good language files, as follows:

composer require hyperf/translation

For related configuration, see Internationalization

<?php

// International configuration

return [
    'params.invalid' => 'Params :param is invalid.',
];

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

#[Constants]
class ErrorCode extends AbstractConstants
{
    /**
     * @Message("params.invalid")
     */
    const PARAMS_INVALID = 1000;
}

$message = ErrorCode::getMessage(ErrorCode::SERVER_ERROR, ['param' => 'user_id']);