Practical CQRS in Laravel Without a Framework | Mohamed Said       [Skip to content](#main)  [ ![](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png) Mohamed SaidLaravel Backend Engineer ](https://www.msaied.com/public) - [Home](https://www.msaied.com/public)
- [Projects](https://www.msaied.com/public/projects)
- [Articles](https://www.msaied.com/public/articles)
- [Certificates](https://www.msaied.com/public/certificates)
- [About](https://www.msaied.com/public#about)

           [  Contact](https://www.msaied.com/public#contact) Menu 

Menu
----

Close 

 - [HomeStart here](https://www.msaied.com/public)
- [ProjectsCase studies](https://www.msaied.com/public/projects)
- [ArticlesEngineering notes](https://www.msaied.com/public/articles)
- [CertificatesCredentials](https://www.msaied.com/public/certificates)
- [AboutHow I work](https://www.msaied.com/public#about)
- [ContactGet in touch](https://www.msaied.com/public#contact)

  [Start a conversation](https://www.msaied.com/public#contact) [WhatsApp](https://wa.me/201094619204) [Email](mailto:hello@msaied.com) 

 1. [Home](https://www.msaied.com/public)
2. /
3. [Articles](https://www.msaied.com/public/articles)
4. /
5. CQRS in Laravel Without a Framework: Commands, Handlers, and Read Models That Stay Lean

 CQRS in Laravel Without a Framework: Commands, Handlers, and Read Models That Stay Lean
========================================================================================

 Skip the heavy event-sourcing libraries. This guide shows how to implement a practical CQRS layer in Laravel using plain PHP classes, the service container, and Eloquent read models — without framework tax.

 ![](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp) [Mohamed Said](https://www.msaied.com/public#person) Published 20 Jul 2026 · Updated 20 Jul 2026 · 1 min read

ShareCopy linkCopied

 ![CQRS in Laravel Without a Framework: Commands, Handlers, and Read Models That Stay Lean](https://cdn.msaied.com/446/a05febe70b72107387f210e0f9eae089.png) 

  On this page +1. [Why CQRS Without a Framework?](#why-cqrs-without-a-framework)
2. [The Command Object](#the-command-object)
3. [The Command Handler](#the-command-handler)
4. [A Minimal Command Bus](#a-minimal-command-bus)
5. [Read Models: Separate Queries from Writes](#read-models-separate-queries-from-writes)
6. [Wiring It Into a Controller](#wiring-it-into-a-controller)
7. [Testing Is Straightforward](#testing-is-straightforward)
8. [Key Takeaways](#key-takeaways)

 Why CQRS Without a Framework?
-----------------------------

Most CQRS tutorials reach for `hirethunk/verbs` or `spatie/laravel-event-sourcing` immediately. Those are excellent packages, but they carry opinions about event stores, projectors, and snapshots that you may not need. If your goal is simply to **separate write intent from read concerns**, you can do it with plain PHP classes and Laravel's service container in an afternoon.

This article focuses on that narrower goal: a command bus, typed command objects, dedicated handlers, and Eloquent-backed read models — nothing more.

---

The Command Object
------------------

A command is a value object expressing intent. It carries validated input; it does not execute anything.

```php
