hongxunpan/business-decision

Business decision and denial reason primitives for PHP applications

Maintainers

Package info

github.com/HongXunPan/business-decision

pkg:composer/hongxunpan/business-decision

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

0.1.0 2026-05-29 01:02 UTC

This package is auto-updated.

Last update: 2026-06-06 06:46:52 UTC


README

hongxunpan/business-decision 用于表达业务动作是否允许执行,以及不允许时的结构化原因。

  • GitHub 仓库:HongXunPan/business-decision
  • Composer 包:hongxunpan/business-decision
  • PHP 命名空间:HongXunPan\BusinessDecision\

定位

本包承接中性的业务决策原语:

  • BusinessDecision:表达业务动作 allowed / denied 的决策结果;
  • BusinessError:表达单个结构化拒绝原因,可被业务项目扩展或包装;
  • BusinessErrorCatalog:从定义表创建 BusinessError,并可生成 BusinessDecision
  • BusinessDecisionException:shared 默认异常;
  • UndefinedBusinessErrorException:未定义业务错误码异常。

本包不承接:

  • HTTP response;
  • simple-framework 的 ApiException
  • ORM / DB 查询;
  • 权限系统;
  • 具体业务错误文案;
  • 具体业务 Ability 规则;
  • DecisionGuard / BusinessErrorGuard
  • denyUnless() / whenAllow()

基本用法

use HongXunPan\BusinessDecision\BusinessDecision;
use HongXunPan\BusinessDecision\BusinessError;

$error = new BusinessError(
    'publish_status_invalid',
    '当前状态不允许发布',
    ['status' => 'archived']
);

$decision = BusinessDecision::denied($error);

if ($decision->isDenied()) {
    $blocker = $decision->requireError()->toBlocker();
}

允许结果使用:

$decision = BusinessDecision::allowed();
$decision->throwIfDenied();

拒绝结果默认抛出 BusinessDecisionException

$decision = BusinessDecision::denied($error);
$decision->throwIfDenied();

错误目录

use HongXunPan\BusinessDecision\BusinessErrorCatalog;

final class AnnouncementErrorCatalog extends BusinessErrorCatalog
{
    public const PUBLISH_STATUS_INVALID = 'publish_status_invalid';

    protected const DEFINITIONS = [
        self::PUBLISH_STATUS_INVALID => [
            'message' => '当前状态不允许发布',
            'extra' => [
                'field' => 'publish_status',
            ],
        ],
    ];
}

$error = AnnouncementErrorCatalog::when(
    $cannotPublish,
    AnnouncementErrorCatalog::PUBLISH_STATUS_INVALID
);

$decision = AnnouncementErrorCatalog::decisionWhen(
    $cannotPublish,
    AnnouncementErrorCatalog::PUBLISH_STATUS_INVALID
);

与业务 Ability 的关系

具体业务 Ability 仍应留在业务项目内。推荐业务项目在自己的 BaseAbility 中提供:

  • denyWhen(...)
  • assertAllowed(BusinessDecision $decision)
  • 项目异常适配,例如转换成 ApiException

本包只表达“决策结果”和“拒绝原因”,不判断具体资源动作是否允许。

验证

composer validate --strict
composer test