Practical CQRS in Laravel Without a Framework | Mohamed Said        [  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png)   Mohamed Said Laravel Backend Engineer  ](https://msaied.com) [ Home ](https://msaied.com) [ Projects ](https://msaied.com/projects) [ Articles  ](https://msaied.com/articles) [ Certificates ](https://msaied.com/certificates) [ Contact ](https://msaied.com#contact-section) 

       [  ](https://github.com/EG-Mohamed)       

 [ Home ](https://msaied.com) [ Projects ](https://msaied.com/projects) [ Articles ](https://msaied.com/articles) [ Certificates ](https://msaied.com/certificates) [ Contact ](https://msaied.com#contact-section) 

  [ home ](https://msaied.com)    [ articles ](https://msaied.com/articles)    CQRS in Laravel Without a Framework: Commands, Handlers, and Read Models That Stay Lean        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)

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

  #laravel   #cqrs   #architecture   #clean-code   #php  

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

     20 Jul 2026      1 min read    ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said  

       Table of contents

1. [  01   Why CQRS Without a Framework?  ](#why-cqrs-without-a-framework)
2. [  02   The Command Object  ](#the-command-object)
3. [  03   The Command Handler  ](#the-command-handler)
4. [  04   A Minimal Command Bus  ](#a-minimal-command-bus)
5. [  05   Read Models: Separate Queries from Writes  ](#read-models-separate-queries-from-writes)
6. [  06   Wiring It Into a Controller  ](#wiring-it-into-a-controller)
7. [  07   Testing Is Straightforward  ](#testing-is-straightforward)
8. [  08   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
