adityapratamaf / laravel-cleanarchitecture-cqrs-starter-template
Laravel Clean Architecture + CQRS Starter Template
Package info
github.com/adityapratamaf/Laravel-CleanArchitecture-CQRS-Starter-Template
Language:Blade
Type:project
pkg:composer/adityapratamaf/laravel-cleanarchitecture-cqrs-starter-template
Requires
- php: ^8.2
- laravel/framework: ^12.0
- laravel/sanctum: *
- laravel/tinker: ^2.10
Requires (Dev)
- fakerphp/faker: ^1.23
- laravel/pail: ^1.2
- laravel/pint: ^1.24
- laravel/sail: ^1.41
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.6
- phpunit/phpunit: ^11.5
README
# ๐ Laravel Clean Architecture + CQRS Project    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
- Controller menerima request
- Validasi via FormRequest
- Membuat Command
- Dispatch ke CommandBus
- Handler memanggil Repository
- Simpan ke database
๐ Read Flow
- Controller menerima request
- Membuat Query
- QueryBus ask ke Handler
- Handler ambil data
- 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
RefreshDatabasepada Feature Test agar migrasi otomatis dan database bersih tiap test.
๐ Membuat Fitur Baru
- Domain โ Entity + Repository Contract
- Infrastructure โ Model + Repository Implementation
- Application โ Command & Query + Handler
- 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.