Laravel Packages

Advanced State Support for Laravel Models

Published
Advanced State Support for Laravel Models image

Laravel Model States is a Spatie package by Brent Roose that adds advanced state support to Laravel models.

For full details on this package, read the official documentation; however, we will provide a few examples from the readme here to give you an idea what this package provides:

Here’s an example from the readme of a Payment model and how you’d define a state for this model using this package:

use Spatie\ModelStates\HasStates;
 
/**
* @property \App\States\PaymentState state
*/
class Payment extends Model
{
use HasStates;
 
protected function registerStates(): void
{
$this
->addState('state', PaymentState::class)
->allowTransition(Pending::class, Paid::class)
->allowTransition(Pending::class, Failed::class, PendingToFailed::class);
}
}

The PaymentState in the example above is defined as follows:

// The abstract PaymentState class
use Spatie\ModelStates\State;
 
abstract class PaymentState extends State
{
abstract public function color(): string;
}
 
// The "paid" state for the Payment model
class Paid extends PaymentState
{
public function color(): string
{
return 'green';
}
}

And finally here’s an example of transitioning the state:

$payment = Payment::find(1);
 
$payment->state->transitionTo(Paid::class);
 
echo $payment->state->color();

According to the package readme, it combines the concepts from the state pattern and state machines—you should be familiar with these concepts before using this package. The video State Pattern – Design Patterns (ep 17) is an excellent resource for understanding the basics of state machines.

To learn more about this package, view the source code on GitHub at spatie/laravel-model-states and read the model states documenation.

This package was submitted to our Laravel News Links section. This section is a place the community can post packages and tutorials around the Laravel ecosystem. Follow along on Twitter @LaravelLinks

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
The Laracon Archive image

The Laracon Archive

Read article
Group Adjacent Collection Items in Laravel with chunkBy() image

Group Adjacent Collection Items in Laravel with chunkBy()

Read article
Laravel queue:work Now Prints Why the Worker Stopped image

Laravel queue:work Now Prints Why the Worker Stopped

Read article
Sidecar Brings Statamic's Control Panel to Your Existing Markdown Sites image

Sidecar Brings Statamic's Control Panel to Your Existing Markdown Sites

Read article
Collections chunkBy() and Storage Path Hardening in Laravel 13.30 image

Collections chunkBy() and Storage Path Hardening in Laravel 13.30

Read article
Forte: Parse and Rewrite Laravel Blade Templates image

Forte: Parse and Rewrite Laravel Blade Templates

Read article