Advanced State Support for Laravel Models

Advanced State Support for Laravel Models

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

Filed in: News / packages
Laravel News Partners

Laravel Jobs

Senior Full-Time Laravel Developer (REMOTE)
Remote, ANYWHERE
Vue School
Senior Laravel Developer
Remote, USA & Canada Only
Givecloud
Backend Software Engineer
Remote, USA Only
CommentSold
Full Stack Laravel Developer (Full-time/Contract)
Remote or Columbus, OH
EduSourced
Backend PHP Developer
Hamburg
ABOUT YOU GmbH

Newsletter

Join 31,000+ others and never miss out on new tips, tutorials, and more.