PHPackages                             utilitarian-dev/utilitarian-laravel-toolkit - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. utilitarian-dev/utilitarian-laravel-toolkit

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

utilitarian-dev/utilitarian-laravel-toolkit
===========================================

Laravel implementation of Utilitarian Architecture: CQRS operations (Query, Command, Action), State Machine, and Data mapping utilities

v0.1.0(1mo ago)034Apache-2.0PHPPHP ^8.3

Since May 13Pushed 1mo agoCompare

[ Source](https://github.com/utilitarian-dev/utilitarian-laravel-toolkit)[ Packagist](https://packagist.org/packages/utilitarian-dev/utilitarian-laravel-toolkit)[ Docs](https://github.com/utilitarian-dev/utilitarian-laravel-toolkit)[ RSS](/packages/utilitarian-dev-utilitarian-laravel-toolkit/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (8)Versions (2)Used By (0)

Utilitarian Laravel Toolkit
===========================

[](#utilitarian-laravel-toolkit)

Laravel implementation of [Utilitarian Architecture](https://github.com/utilitarian-dev/architecture) — a pragmatic approach to organizing applications around business operations (use cases) rather than technical layers.

What's Included
---------------

[](#whats-included)

- CQRS-style `Query`, `Command`, and `Action` operations with buses, middleware, and boot-time dependency injection
- Eloquent-backed state storage and enum transition rules
- Lightweight DTO/data mapping helpers
- JSON, cache key, alert, reflection, route metadata, and debug utilities

Requirements
------------

[](#requirements)

- PHP 8.3+
- Laravel 11+

Installation
------------

[](#installation)

```
composer require utilitarian-dev/utilitarian-laravel-toolkit
```

The service provider is registered automatically via Laravel's package discovery.

Optionally, publish the configuration:

```
php artisan vendor:publish --tag=utilitarian-config
```

Core Components
---------------

[](#core-components)

### Query

[](#query)

Read-only operations. Execute via `QueryBus` or `dispatch()`.

```
class GetUserQuery extends Query
{
    public function __construct(
        private readonly int $userId,
    ) {}

    public function execute(): ?User
    {
        return User::query()->find($this->userId);
    }
}

// Execute
$user = GetUserQuery::make(userId: 1)->dispatch();
// or
$user = QueryBus::execute(GetUserQuery::make(userId: 1));
```

### Command

[](#command)

Write-only operations. Execute via `CommandBus` or `dispatch()`.

```
class CreateUserCommand extends Command
{
    public function __construct(
        private readonly string $email,
        private readonly string $name,
    ) {}

    public function execute(): User
    {
        return User::query()->create([
            'email' => $this->email,
            'name' => $this->name,
        ]);
    }
}

// Execute
$user = CreateUserCommand::make(email: '...', name: '...')->dispatch();
```

### Action

[](#action)

Business logic and orchestration. Execute via `ActionBus` or `dispatch()`.

```
class RegisterUserAction extends Action
{
    public function __construct(
        private readonly string $email,
        private readonly string $name,
    ) {}

    public function execute(): User
    {
        $user = CreateUserCommand::make(
            email: $this->email,
            name: $this->name
        )->dispatch();

        SendWelcomeEmailCommand::make(userId: $user->id)->dispatch();

        return $user;
    }
}

// Execute
$user = RegisterUserAction::make(email: '...', name: '...')->dispatch();
// or
$user = ActionBus::execute(RegisterUserAction::make(email: '...', name: '...'));
```

### Dependency Injection

[](#dependency-injection)

Pass business parameters to the constructor. Inject runtime dependencies in a public `boot()` method.

```
class SyncProductToSearchIndexCommand extends Command
{
    private SearchIndexClient $search;

    public function __construct(
        private readonly Product $product,
    ) {}

    public function boot(SearchIndexClient $search): void
    {
        $this->search = $search;
    }

    public function execute(): void
    {
        $this->search->index('products', [
            'id' => $this->product->id,
            'name' => $this->product->name,
        ]);
    }
}
```

Middleware
----------

[](#middleware)

Configure middleware in `config/utilitarian.php`:

```
return [
    'cqrs' => [
        'query_middleware' => [
            \Utilitarian\Cqrs\Middleware\CachingMiddleware::class,
        ],
        'command_middleware' => [
            \Utilitarian\Cqrs\Middleware\TransactionMiddleware::class,
        ],
        'action_middleware' => [
            \Utilitarian\Cqrs\Middleware\AuthorizationMiddleware::class,
        ],
    ],
];
```

Per-operation middleware:

```
class MyQuery extends Query
{
    public function middleware(): array
    {
        return [CustomMiddleware::class];
    }

    public function excludeMiddleware(): array
    {
        return [UnwantedMiddleware::class];
    }
}
```

Built-in middleware:

- `TransactionMiddleware` — wraps execution in database transaction
- `CachingMiddleware` — caches query results
- `ValidationMiddleware` — validates operation data
- `AuthorizationMiddleware` — checks access permissions

Optional Utilities
------------------

[](#optional-utilities)

The package also registers helpers and facades for JSON handling, cache key generation, alerts, reflection, route metadata, and debug output.

Debugging works with Laravel's built-in dump/logging drivers by default. LaraDumps support is optional:

```
composer require laradumps/laradumps --dev
```

State Machine
-------------

[](#state-machine)

Manage state for Eloquent models with three levels of complexity:

```
use Utilitarian\StateMachine\Traits\HasStateMachine;

class Order extends Model
{
    use HasStateMachine;
}
```

### Key-Value Storage

[](#key-value-storage)

```
$order->state()->set('notes', 'Special handling');
$order->state()->get('notes');
$order->state()->has('notes');
$order->state()->forget('notes');
```

### Enum States (no rules)

[](#enum-states-no-rules)

```
$order->state()->transitionTo(OrderState::Paid);
$order->state()->current(); // OrderState::Paid
$order->state()->is(OrderState::Paid); // true
```

### Enum States (with transition rules)

[](#enum-states-with-transition-rules)

```
enum OrderState: string implements FlowHandler
{
    case Pending = 'pending';
    case Paid = 'paid';
    case Shipped = 'shipped';

    public function canTransitionTo(UnitEnum $target): bool
    {
        return match ($this) {
            self::Pending => $target === self::Paid,
            self::Paid => $target === self::Shipped,
            self::Shipped => false,
        };
    }
}

$order->state()->transitionTo(OrderState::Paid); // OK
$order->state()->transitionTo(OrderState::Shipped); // throws InvalidTransitionException
```

**Database Setup:**

Migrations are loaded automatically. Run:

```
php artisan migrate
```

Data Mapping
------------

[](#data-mapping)

Lightweight DTOs with automatic property mapping:

```
use Utilitarian\Data\Data;

class UserData extends Data
{
    public function __construct(
        public readonly int $id,
        public readonly string $email,
        public readonly string $name,
    ) {}
}

// Create from array
$userData = UserData::from([
    'id' => 1,
    'email' => 'user@example.com',
    'name' => 'John Doe',
]);

// Convert back to array
$array = $userData->toArray();
```

Custom field mapping:

```
use Utilitarian\Data\Attributes\MapField;

class UserData extends Data
{
    public function __construct(
        public readonly int $id,
        #[MapField('email_address')]
        public readonly string $email,
    ) {}
}
```

Testing
-------

[](#testing)

```
composer test                      # Run tests
composer test:coverage            # Run with coverage
vendor/bin/pest --filter TestName # Run specific test
```

Code Quality
------------

[](#code-quality)

```
composer lint                     # Fix code style
composer lint:test               # Check code style
```

License
-------

[](#license)

Licensed under the Apache License 2.0. See [LICENSE](LICENSE.txt) for details.

Credits
-------

[](#credits)

Created by [Vasilii Shvakin](mailto:vasilii.shvakin@gmail.com)

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance90

Actively maintained with recent releases

Popularity10

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

52d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/771328?v=4)[Vasilii Shvakin](/maintainers/vasiliishvakin)[@vasiliishvakin](https://github.com/vasiliishvakin)

---

Top Contributors

[![vasiliishvakin](https://avatars.githubusercontent.com/u/771328?v=4)](https://github.com/vasiliishvakin "vasiliishvakin (2 commits)")

---

Tags

laravelquerycommandcqrsstate-machineactionuse caseutilitarian-architecture

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/utilitarian-dev-utilitarian-laravel-toolkit/health.svg)

```
[![Health](https://phpackages.com/badges/utilitarian-dev-utilitarian-laravel-toolkit/health.svg)](https://phpackages.com/packages/utilitarian-dev-utilitarian-laravel-toolkit)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M200](/packages/laravel-ai)[moonshine/moonshine

Laravel administration panel

1.3k253.1k81](/packages/moonshine-moonshine)[illuminate/pipeline

The Illuminate Pipeline package.

9349.2M282](/packages/illuminate-pipeline)[nativephp/mobile

NativePHP for Mobile

1.1k75.1k95](/packages/nativephp-mobile)[webwizo/laravel-shortcodes

Wordpress like shortcodes for Laravel 11, 12 and 13

217700.9k8](/packages/webwizo-laravel-shortcodes)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
