adityapratamaf/laravel-cleanarchitecture-cqrs-starter-template

Laravel Clean Architecture + CQRS Starter Template

Maintainers

Package info

github.com/adityapratamaf/Laravel-CleanArchitecture-CQRS-Starter-Template

Language:Blade

Type:project

pkg:composer/adityapratamaf/laravel-cleanarchitecture-cqrs-starter-template

Statistics

Installs: 13

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.12 2026-03-01 10:32 UTC

This package is not auto-updated.

Last update: 2026-03-02 08:50:12 UTC


README

# ๐Ÿš€ Laravel Clean Architecture + CQRS Project

![MIT License](https://img.shields.io/badge/License-MIT-green.svg)
![Laravel 12](https://img.shields.io/badge/Laravel-12.x-FF2D20?logo=laravel&logoColor=white)
![PHP 8.2+](https://img.shields.io/badge/PHP-8.2+-777BB4?logo=php&logoColor=white)

Aplikasi berbasis **Laravel 12** dengan pendekatan  
**Clean Architecture + CQRS (Command & Query Responsibility Segregation)**.

Dirancang untuk:
- ๐ŸŒ REST API (JSON)
- ๐Ÿ–ฅ Web Interface (Blade)
- ๐Ÿ” API Authentication (Laravel Sanctum)
- ๐Ÿ—„ Multi-database ready (MySQL, PostgreSQL, SQL Server, Oracle)
- ๐Ÿ“ˆ Struktur scalable & maintainable

---

## ๐Ÿ“š Table of Contents

- [โœจ Spesifikasi](#-spesifikasi)
- [๐Ÿ— Arsitektur](#-arsitektur)
- [๐Ÿง  Clean Architecture & CQRS](#-clean-architecture--cqrs)
- [๐ŸšŒ CommandBus & QueryBus](#-commandbus--querybus)
- [๐Ÿ”„ Flow CQRS](#-flow-cqrs)
- [๐Ÿ“‚ Struktur Folder](#-struktur-folder)
- [โš™ Instalasi](#-instalasi)
- [๐Ÿ” Authentication (Sanctum)](#-authentication-sanctum)
- [๐ŸŒ API Documentation](#-api-documentation)
- [๐Ÿ“ฆ Pagination Helper](#-pagination-helper)
- [๐Ÿ”Ž Search Case-Insensitive](#-search-case-insensitive)
- [๐Ÿ—„ Multi Database Setup](#-multi-database-setup)
- [๐Ÿงช Testing](#-testing)
- [๐Ÿ†• Membuat Fitur Baru](#-membuat-fitur-baru)
- [๐ŸŒฑ Seeding](#-seeding)
- [๐Ÿ›  Troubleshooting](#-troubleshooting)
- [๐Ÿงฉ Konvensi Coding](#-konvensi-coding)
- [๐Ÿ“„ License](#-license)

---

## โœจ Spesifikasi

| Component        | Version |
|------------------|---------|
| ๐Ÿ˜ PHP           | 8.2+    |
| ๐Ÿ”ฅ Laravel       | 12.x    |
| ๐Ÿ” Sanctum       | API Token Authentication |
| ๐Ÿ—„ Database      | MySQL / PostgreSQL / SQL Server / Oracle |
| ๐Ÿ— Architecture  | Clean Architecture + CQRS |
| ๐ŸŒ Interface     | REST API + Blade |

---

## ๐Ÿ— Arsitektur

Struktur arsitektur mengikuti prinsip pemisahan tanggung jawab:

```text
Presentation โ†’ Application โ†’ Domain
        โ†“
   Infrastructure

๐Ÿ“Œ Domain

  • Entity
  • Repository Contract
  • Business Rules

๐Ÿ“Œ Application

  • Command (Write Side)
  • Query (Read Side)
  • CommandBus & QueryBus

๐Ÿ“Œ Infrastructure

  • Eloquent Model
  • Repository Implementation
  • Database Connection

๐Ÿ“Œ Presentation

  • API Controller
  • Web Controller
  • Form Request
  • Blade View

๐Ÿง  Clean Architecture & CQRS

๐Ÿ› Clean Architecture

Diperkenalkan oleh Robert C. Martin (Uncle Bob).

Tujuan:

  • Memisahkan business logic dari framework
  • Meningkatkan testability
  • Mengurangi ketergantungan pada database & UI
  • Membuat sistem lebih scalable

๐Ÿ” Dependency Rule

Dependensi hanya boleh mengarah ke dalam (ke Domain).

Framework / DB / UI
        โ†“
Infrastructure
        โ†“
Application
        โ†“
Domain (Core Business)

Domain:

  • Tidak tahu Laravel
  • Tidak tahu HTTP
  • Tidak tahu database

โšก CQRS

Diperkenalkan oleh Greg Young.

Memisahkan:

  • โœ Command โ†’ Mengubah state
  • ๐Ÿ“– Query โ†’ Mengambil data

Tujuan:

  • Optimasi read & write
  • Mengurangi kompleksitas
  • Memudahkan scaling

๐ŸšŒ CommandBus & QueryBus

Untuk menghindari tight coupling antara Controller dan Handler, digunakan mediator pattern:

  • ๐ŸšŒ CommandBus
  • ๐ŸšŒ QueryBus

๐ŸšŒ CommandBus

Menangani operasi yang mengubah state.

Flow:

Controller โ†’ Command โ†’ CommandBus โ†’ Handler โ†’ Repository โ†’ Database

Contoh:

$command = new CreateUserCommand($name, $email, $password);
$this->commandBus->dispatch($command);

Karakteristik:

  • Fokus pada perubahan data
  • Tidak untuk mengambil data kompleks
  • 1 Command = 1 Handler

๐ŸšŒ QueryBus

Menangani operasi read-only.

Flow:

Controller โ†’ Query โ†’ QueryBus โ†’ Handler โ†’ Read Model โ†’ Response

Contoh:

$query = new ListUsersQuery($search, $page, $perPage);
$result = $this->queryBus->ask($query);

Karakteristik:

  • Tidak mengubah state
  • Return DTO / array / pagination
  • Terpisah dari write logic

๐Ÿ”„ Flow CQRS

โœ Write Flow

  1. Controller menerima request
  2. Validasi via FormRequest
  3. Membuat Command
  4. Dispatch ke CommandBus
  5. Handler memanggil Repository
  6. Simpan ke database

๐Ÿ“– Read Flow

  1. Controller menerima request
  2. Membuat Query
  3. QueryBus ask ke Handler
  4. Handler ambil data
  5. Return data + meta pagination

๐Ÿ“‚ Struktur Folder

app/
โ”œโ”€โ”€ Domain/
โ”œโ”€โ”€ Application/
โ”œโ”€โ”€ Infrastructure/
โ”œโ”€โ”€ Presentation/
โ”œโ”€โ”€ Supports/
routes/

โš™ Instalasi

๐Ÿš€ Opsi 1 โ€” Install sebagai Project Template (Recommended)

Gunakan jika ingin membuat project baru dari template Clean Architecture + CQRS.

composer create-project adityapratamaf/laravel-clean-architecture-cqrs my-app
cd my-app
php artisan serve

Akses:

๐Ÿ“ฆ Opsi 2 โ€” Install sebagai Package ke Project Laravel yang Sudah Ada

Gunakan jika ingin menambahkan Clean CQRS ke project Laravel existing.

1๏ธโƒฃ Install Package

composer require adityapratamaf/clean-cqrs

2๏ธโƒฃ Publish Configuration (jika ada)

php artisan vendor:publish --tag=clean-cqrs

3๏ธโƒฃ Jalankan Installer

php artisan clean-cqrs:install

๐Ÿ›  Manual Setup (Jika Clone Repository)

Jika kamu clone repository secara manual:

1๏ธโƒฃ Install Dependencies

composer install

2๏ธโƒฃ Setup Environment

cp .env.example .env
php artisan key:generate

3๏ธโƒฃ Konfigurasi Database di .env

Contoh PostgreSQL:

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=db_project
DB_USERNAME=postgres
DB_PASSWORD=your_password

4๏ธโƒฃ Migrasi Database

php artisan migrate

5๏ธโƒฃ (Optional) Seeding

php artisan migrate:fresh --seed

6๏ธโƒฃ Jalankan Server

php artisan serve

Akses:

๐Ÿ” Authentication (Sanctum)

Project menggunakan Laravel Sanctum (Bearer Token).

Install

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

Middleware

Route::middleware('auth:sanctum')->get('/me', MeController::class);

๐ŸŒ API Documentation

Dokumentasi lengkap: api-documentation.md (Berisi contoh request/response & cURL untuk Login, Me, Logout, dan CRUD Users)

๐Ÿ“ฆ Pagination Helper

๐Ÿ“ File: app/Supports/Paginator.php

return Paginator::paginateWithMeta($query, $perPage, $page);

๐Ÿ”Ž Search Case-Insensitive

$qb->whereRaw('LOWER(name) LIKE ?', ["%{$s}%"]);

Compatible:

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle

๐Ÿ—„ Multi Database Setup

.env:

DB_CONNECTION=mysql
# DB_CONNECTION=pgsql
# DB_CONNECTION=sqlsrv
# DB_CONNECTION=oracle

Untuk Oracle:

composer require yajra/laravel-oci8

๐Ÿงช Testing

Project mendukung Unit Test dan Feature Test menggunakan PHPUnit (bawaan Laravel).

โ–ถ๏ธ Menjalankan semua test

php artisan test

๐Ÿงช Menjalankan hanya Unit Test

php artisan test --testsuite=Unit

๐Ÿงช Menjalankan hanya Feature Test

php artisan test --testsuite=Feature

๐ŸŽฏ Menjalankan test tertentu

php artisan test --filter=UserCrudTest
php artisan test --filter=RegisterUserCommandHandlerTest
php artisan test --filter=LoginTest

๐Ÿ—„ Testing dengan database

Disarankan menggunakan database khusus testing atau SQLite in-memory.

Contoh .env.testing:

APP_ENV=testing
DB_CONNECTION=sqlite
DB_DATABASE=:memory:

Lalu jalankan:

php artisan test

Tips: gunakan trait RefreshDatabase pada Feature Test agar migrasi otomatis dan database bersih tiap test.

๐Ÿ†• Membuat Fitur Baru

  1. Domain โ†’ Entity + Repository Contract
  2. Infrastructure โ†’ Model + Repository Implementation
  3. Application โ†’ Command & Query + Handler
  4. Presentation โ†’ Controller

๐ŸŒฑ Seeding

User::factory()->count(100)->create();

๐Ÿ›  Troubleshooting

Route tidak muncul:

php artisan optimize:clear
php artisan route:list

Class tidak ditemukan:

composer dump-autoload

๐Ÿงฉ Konvensi Coding

  • ๐Ÿ“– Read side tidak return Entity
  • โœ Write side boleh return Entity
  • ๐Ÿ—„ Repository di Infrastructure
  • ๐Ÿ“ฆ Pagination wajib pakai helper
  • ๐ŸŽฏ Controller hanya orchestration

๐Ÿ“„ License

MIT License ยฉ 2026 Aditya Pratama Febriono This project is open-sourced software licensed under the MIT license.