laravel-enso/versions

Prevents update conflicts using the optimistic lock pattern in Laravel

Maintainers

Package info

github.com/laravel-enso/versions

pkg:composer/laravel-enso/versions

Statistics

Installs: 9 690

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 1

2.0.6 2026-04-21 08:24 UTC

This package is auto-updated.

Last update: 2026-04-21 15:29:03 UTC


README

License Stable Downloads PHP Issues Merge Requests

Description

Versions prevents concurrent-update conflicts through an optimistic-lock field on Eloquent models.

The package increments a version column on each update, checks the persisted version under a database lock before writing, and throws an HTTP 409 conflict when the record was modified after it was loaded.

It can work independently of the Laravel Enso ecosystem.

Installation

Install the package:

composer require laravel-enso/versions

Add the trait to a model that has a version column:

use Illuminate\Database\Eloquent\Model;
use LaravelEnso\Versions\Traits\Versions;

class Invoice extends Model
{
    use Versions;
}

The trait expects a version integer column by default. To use another column name, define a protected $versioningAttribute property on the model.

Features

  • Sets the version column to 1 when creating a model.
  • Starts a database transaction before updates and checks the persisted version under a lock.
  • Increments the version automatically when the update is accepted.
  • Throws a ConflictHttpException when another process already changed the record.

Usage

Manual version check:

$invoice->checkVersion($request->integer('version'));

Custom version column:

class Invoice extends Model
{
    use Versions;

    protected string $versioningAttribute = 'lock_version';
}

If the check fails, the package throws LaravelEnso\\Versions\\Exceptions\\Version, which extends Symfony's ConflictHttpException.

API

Trait

  • LaravelEnso\\Versions\\Traits\\Versions

Main methods:

  • checkVersion(?int $version = null): void

Lifecycle hooks:

  • bootVersions()

Exception

  • LaravelEnso\\Versions\\Exceptions\\Version

Factory method:

  • Version::recordModified(string $class)

Depends On

This package has no Enso package dependencies and can be used independently.

Contributions

are welcome. Pull requests are great, but issues are good too.

Thank you to all the people who already contributed to Enso!

License

MIT