weiwenhao/state-machine
Composer 安装命令:
composer require weiwenhao/state-machine
包简介
state machine
关键字:
README 文档
README
基于laravel model的状态管理扩展
开发中经常需要为实体定义一些状态 如对于文章实体可能会有 new/draft/deleted 对于支付实体可能会有 awaiting_payment/cancelled/paid/refunded
对于订单实体↓
面对开发过程中繁杂的状态,我们需要一个状态管理工具. 而state-machine就是管理状态之间转换的一个laravel扩展,拥有优雅的语法与回调机制.
安装
composer require weiwenhao/state-machine
支持laravel5.5+版本
创建graph
php artisan make:graph TestGraph
运行该命令将会在app\Graphs目录下创建一个TestGraph文件.
如果你不明白如何配置 graph,则可以运行
php artisan make:graph TestGraph -demo 来生成一个demo.
<?php namespace App\Graphs; use Illuminate\Database\Eloquent\Model; use Weiwenhao\StateMachine\Graph; class TestGraph extends Graph { /** * 所有可选的状态 * @var array */ protected $states = [ 'cart', 'new', 'cancelled', 'fulfilled' ]; /** * 初始状态 * @var string */ protected $initState = 'cart'; /** * 定义状态之间的转换 * @var array */ protected $graph= [ 'create' => [ 'from' => ['cart'], 'to' => 'new', ], 'cancel' => [ 'from' => ['new'], 'to' => 'cancel', ], 'fulfilled' => [ 'from' => ['new'], 'to' => 'fulfilled' ] ]; /** * Model中用于进行状态转换的key 默认使用state字段 * @var string */ protected $key = 'state'; /** * 转换发生时调用的回调(后置回调) * @param $object * @return string */ public function onCreate(Model $object) { return 'created'; } }
其中对于state更推荐使用一个enum类型来处理,所以我通常会在laravel的app目录下创建一个Enums目录来存放枚举类型
<?php namespace App\Enums; interface OrderState { const NEW = 0; const CANCELLED = 1; const FULFILLED = 2; }
使用
init graph
$testGraph = new TestGraph($order) 或 $testGraph = TestGraph::with($order)
init state
TestGraph::with($order)->init()
使用Graph中定义的initState对$order的state属性进行初始化
apply transition
TestGraph::with($order)->apply('cancel')
对$order的state属性应用cancel这个转换,如果不允许应用cancel则会抛出一个 StateMachineException
由于apply方法严格遵守TestGraph中$graph中定义的状态转换.如果存在可能会出现异常的apply(),并且想要处理失败后的结果则可以像下面这样处理
use Weiwenhao\StateMachine\StateMachineException
try {
TestGraph::with($order)->apply('cancel')
} cache (StateMachineException $e) {
// handle...
}
如果你觉得这样太过麻烦, 只需要在apply的时候传递第二个参数为true, 则对于不允许apply的情况则不会抛出异常, 而是返回一个false;
state-machine只是进行了state的状态转换,不会去进行model的save操作
apply event
在apply transition后,state-machine 回去对应的Graph中查找是否存在对应的transition回调,有则调用, 并且将对应的model作为参数传递
如TestGraph::with($order)->apply('cancel')则会调用TestGraph下的onCancel
<?php # TestGraph.php public function onCancel($order) { // cancel.. }
laravel model的观察者模式已经是一种很优雅的事件处理机制了,可能有个同学会觉得两者存在冲突. 但是我认为并不会, model event专注于整个模型实体的增删改事件, 而state则是更加细颗粒的,更加专注于处理state的事件机制.
can transition
TestGraph::with($order)->can('cancel')
返回一个bool值,在apply()的时候会先调用can进行检测
get state
TestGraph::with($order)->getState()
在model中使用 $order->state 是一种更加方便的选择
get possible transitions
TestGraph::with($order)->getPossibleTransitions()
返回一个array,包含当前状态下可以使用的transitions
其他可选方案
weiwenhao/state-machine 适用场景与选型建议
weiwenhao/state-machine 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 394 次下载、GitHub Stars 达 66, 最近一次更新时间为 2018 年 06 月 21 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「state」 「laravel」 「state-machine」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 weiwenhao/state-machine 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 weiwenhao/state-machine 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 weiwenhao/state-machine 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Doctrine implementation of the MetaborStd (Statemachine) for PHP 8.2+
A simple state dropdown field for SilverStripe forms
A state Machine library for business processes
Metamel Addresses is a polymorphic Laravel package, for address book management. You can add addresses to any eloquent model with ease.
Control your state using enums
Convert and operate with FIPS codes for states, counties, etc.
统计信息
- 总下载量: 394
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 66
- 点击次数: 5
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-06-21