bestyii / yii2-state-machine
Yii2 State Machine
Installs: 25
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 4
Type:yii2-extension
Requires
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-10-29 05:53:27 UTC
README
This package enable state machine usage into attributes of a Model (Active Record).
Installation
The preferred way to install this extension is through composer.
Either run
composer require bestyii/yii2-state-machine
or add
"bestyii/yii2-state-machine": "dev-master"
to the require
section of your composer.json.
Usage
Model definition:
/// Model namespace app\models; class User extends \yii\db\ActiveRecord { const STATUS_ACTIVE = 'ACTIVE'; const STATUS_INACTIVE = 'INACTIVE'; const STATUS_DISABLED = 'DISABLED'; public function modelLabel() { return 'User'; } public function behaviors() { return \yii\helpers\ArrayHelper::merge(parent::behvaiors(), [ [ 'class' => bestyii\state\Machine::class, 'initial' => self::STATUS_PENDING, /// Initial status 'attr' => 'status', /// Attribute that will use this state machine 'model_label' => $this->modelLabel(), 'transitions' => [ Active::className(), Inactive::className(), Disabled::className() ] ] ]); } }
Status definitions:
/// Active status namespace app\models\status\user; use bestyii\state\Status; class Active extends Status { public $id = User::STATUS_ACTIVE; public $label = 'Active'; public $labelColor = 'primary'; public static $availableStatus = [User::STATUS_INACTIVE, User::STATUS_DISABLED]; public function canChangeTo($id,$model){ return true; } public function onExit($id, $event,$model) { /// event triggered when the status is changed from Active to another status } public function onEntry($id, $event,$model) { /// event triggered when the status is changed from another status to Active } }
Example:
$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');