hongxunpan / business-decision
Business decision and denial reason primitives for PHP applications
0.1.0
2026-05-29 01:02 UTC
Requires
- php: ^8.0.20
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