romanfranko / yii2-state-machine
此包的最新版本(0.1.2)没有提供许可证信息。
Yii2状态机
0.1.2
2024-09-05 13:39 UTC
Requires
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-09-05 13:40:39 UTC
README
此包可以将状态机用于模型的属性(Active Record)。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令
composer require romanfranko/yii2-state-machine
或将以下内容添加到 composer.json 文件的 require
部分。
"romanfranko/yii2-state-machine": "dev-master"
使用方法
模型定义
/// Model namespace app\models; class User extends \yii\db\ActiveRecord { public function modelLabel() { return 'User'; } public function behaviors() { return \yii\helpers\ArrayHelper::merge(parent::behvaiors(), [ [ 'class' => romanfranko\state\Machine::class, 'initial' => 'active', /// Initial status 'attr' => 'status', /// Attribute that will use this state machine 'namespace' => 'app\models\status\user', /// Namespace for the Status class definitions 'model_label' => $this->modelLabel(), 'transitions' => [ 'active' => ['inactive', 'disabled'], 'inactive' => ['active', 'disabled'], 'disabled' => ['inactive'] ] ] ]); } }
状态定义
/// Active status namespace app\models\status\user; use romanfranko\state\Status; class Active extends Status { public const ID = 'active'; public $label = 'Active'; public $labelColor = 'primary'; public function onExit($id, $event) { /// event triggered when the status is changed from Active to another status return true; } public function onEntry($id, $event) { /// event triggered when the status is changed from another status to Active return true; } }
/// Inactive Status namespace app\models\status\user; use romanfranko\state\Status; class Inactive extends Status { public const ID = 'inactive'; public $label = 'Inactive'; public $labelColor = 'danger'; public function onExit($id, $event) { /// event triggered when the status is changed from Inactive to another status return true; } public function onEntry($id, $event) { /// event triggered when the status is changed from another status to Inactive return true; } }
/// Disabled Status namespace app\models\status\user; use romanfranko\state\status; class Disabled extends Status { public const ID = 'disabled'; public $label = 'Disabled'; public $labelColor = 'muted'; public function onExit($id, $event) { /// event triggered when the status is changed from Disabled to another status return true; } public function onEntry($id, $event) { /// event triggered when the status is changed from another status to Disabled return true; } }
示例
$user = new User(); /// Returns the current status: new Active() $user->status; /// Returns the allowed status IDs that can be changed to in this case: ['inactive', 'disabled'] $user->allowedStatusChanges(); /// Returns a boolean value in this case: true $user->canChangeTo('inactive'); /// in this case: false. Since this status is not defined in the transitions key values. $user->canChangeTo('unknown'); /// Returns all the defined Status in the Model, in this case: /// ['active' => new Active(), 'inactive' => new Inactive(), 'disabled' => new Disabled()] $user->availableStatus(); /// Change from Active to Inactive triggering the events onEntry of inactive and onExit of Active $user->changeTo('inactive'); /// Returns the current status: new Inactive() $user->status; /// Change from Inactive to Disabled triggering the events onExit of inactive and onEntry of Disabled $user->changeTo('disabled'); /// Throws a error since disabled cant be changed to active. $user->changeTo('active');