PHP code example of webrek / laravel-state-machine
1. Go to this page and download the library: Download webrek/laravel-state-machine library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
webrek / laravel-state-machine example snippets
use Webrek\StateMachine\StateMachine;
use Webrek\StateMachine\Transition;
class OrderStatus extends StateMachine
{
public function states(): array
{
return ['pending', 'paid', 'shipped', 'delivered', 'cancelled'];
}
public function transitions(): array
{
return [
'pay' => Transition::from('pending')->to('paid'),
'ship' => Transition::from('paid')->to('shipped')
->guard(fn ($order) => filled($order->address)),
'deliver' => Transition::from('shipped')->to('delivered'),
'cancel' => Transition::from(['pending', 'paid'])->to('cancelled'),
];
}
public function initialState(): string
{
return 'pending';
}
}
use Illuminate\Database\Eloquent\Model;
use Webrek\StateMachine\Concerns\HasStateMachines;
class Order extends Model
{
use HasStateMachines;
public function stateMachines(): array
{
return ['status' => OrderStatus::class];
}
}
$order = Order::create(); // status initialized to "pending"
$order->stateMachine()->can('pay'); // true
$order->stateMachine()->allowed(); // ['pay', 'cancel']
$order->stateMachine()->apply('pay'); // status is now "paid", persisted
$order->stateMachine()->apply('deliver'); // throws TransitionNotAllowedException
$sm = $order->stateMachine('status');
$sm->state(); // 'paid'
$sm->is('paid'); // true
$sm->can('ship'); // bool — allowed from here AND the guard passes
$sm->allowed(); // ['ship', ... ] names of transitions available now
$sm->canTransitionTo('shipped'); // bool
$sm->apply('ship', ['carrier' => 'DHL']); // returns the model
$sm->history(); // Collection of recorded transitions
'refund' => Transition::from('paid')->to('refunded')
->using(function ($order, array $context) {
$order->payment->refund(); // if this throws an exception...
$order->refund_reference = $context['reference'];
$order->save();
}),
$order->stateMachine()->toMermaid();
// or, for a definition class:
(new OrderStatus)->toMermaid();
Event::listen(StateTransitioned::class, function ($event) {
if ($event->transition === 'ship') {
Notification::send($event->model->customer, new OrderShipped($event->model));
}
});
$order->stateMachine()->history()->each(function ($row) {
echo "{$row->from_state} → {$row->to_state} via {$row->transition}";
});
public function stateMachines(): array
{
return [
'status' => OrderStatus::class,
'payment_status' => PaymentStatus::class,
];
}
$order->stateMachine('payment_status')->apply('authorize');