Skip to content

Instantly share code, notes, and snippets.

@verdipratama
Forked from RayhanYulanda/ddd.md
Created November 10, 2021 15:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save verdipratama/c2a16a40a3e7efd019069703e4ef3f6a to your computer and use it in GitHub Desktop.
Save verdipratama/c2a16a40a3e7efd019069703e4ef3f6a to your computer and use it in GitHub Desktop.
Struktur folder Laravel dengan pendekatan DDD

Table of contents

Struktur Folder

/app
├── /Console
|   ├── Kernel.php
├── /Domain
|  ├── /MyDomainA
|  |   ├── /Application
|  |   ├── /Entities
|  |   ├── /Event
|  |   ├── /Listener
|  |   ├── /Mail
|  |   ├── /Notifications
|  |   ├── /Observers
|  |   ├── /Repositories
|  |   ├── /Services
|  ├── /MyDomainB
|  |   ├── /Entities
|  |   ├── /Repositories
|  |   ├── /Services
|  ├── .
|  ├── .
|  ├── .
├── /Exceptions
|  ├── /MyDomainA
|  ├── /MyDomainB
|  ├── .
|  ├── .
├── /Infrastructure
|  ├── /Google
|  ├── /Firebase
|  ├── /Doku
|  ├── /Instagram
├── /Http
|   ├── /Controllers
|   ├── /Middleware
|   ├── /Requests
|   ├── /Resources
|   ├── Kernel.php
├── /Libraries
|  ├── /TranslateResource.php
├── /Providers
├── /Rules
/bootstrap
/config
/database
/docker
/public
/resources
/routes
/storage
/tests
/vendor
(File lainnya seperti .env, artisan, composer.json, dll.)

Penjelasan Folder dan Contoh

Saya akan menjelaskan beberapa fungsi folder untuk merapikan kode khususnya pada framework laravel. Setiap isi folder domain diisikan sesuai dengan kebutuhannya. MyDomainA merepresentasikan hampir semua keperluan yang bisa ditambahkan ke domain.

Domain

Folder domain adalah kunci utama kita membuat kode, folder ini mempresentasikan konsep, aturan dan logika bisnis.
Contoh: Activity, PropertyManagement, PaymentManagement, dll

Entities

Entities berisikan model-model yang dibutuhkan untuk suatu domain. Namun perlu diingat isi dari file model disini hanya berisikan relation, table define, fillable, set attribut dan get atribut saja.
Contoh: PropertyManagement berisikan PropertyImage, PropertyDocument, PropertyType dan lainnya.

Repositories

Repositories berisikan query-query yang dibutuhkan oleh domain namun hanya untuk get data saja.
Contoh : byUserId(), isMeOwner() dan lainnya.

Services

Services berisikan proses add database, update database, add file, delete file yang berhubungan langsung dengan database dan storage. Pada service juga bisa memanggil event jika dibutuhkan seperti Event BuyProduct dengan Listener mengirimkan email, sms dan log setelah user membeli barang.
Contoh : createPropertyCategory(), createPropertyType() dan lainnya.

Observers

Observers berguna untuk perubahan-perubahan atau logika yang berjalan ketika saving, updating, deleted dan lainnya. Observer harus di daftarkan ke Providers/AppServiceProvider.php.
Contoh : Misalkan kita ingin menyimpan data kita dalam bahasa lain yang sudah di translate dalam bahasa inggris oleh google translate API maka pada method saved() kita bisa menambahkan data yang sudah di translate untuk disimpan ke dalam database.

Event

Seperti contoh sebelumnya pada services, event berguna untuk mendefinisikan suatu event.
Contoh : BuyProduct.php

Listener

Seperti contoh sebelumnya, listener berguna untuk melakukan beberapa hal setelah eventnya berjalan.
Contoh : SendingEmail.php, SendToLog.php dan SendingSMS.php.

Application

Application berisikan kebutuhan pemanggilan services ataupun repositories untuk menyusun flow suatu bisnis proses.
Contoh : PropertyDocumentApplication.php

Mail

Berisikan kebutuhan untuk mengirim email seperti judul, template dan dikirimkan ke siapa.
Contoh : UserRegister.php

Notifications

Berisikan kebutuhan untuk notifikasi.
Contoh : PaymentFailedNotification.php

Infrastructure

Infrastructure berisikan pemanggilan third-party dan beberapa kebutuhan utama lainnya.
Contoh : Doku (untuk pembayaran), Instagram (untuk auto posting) dan lainnya.

Controllers

Controller berisikan validasi request dan pemanggilan application yang dibutuhkan. Jika pemanggilan pada API maka return json dan untuk kebutuhan aplikasi web maka return bisa berisikan redirect atau json untuk ajax.
Contoh : PropertyController.php

Requests

Requests berisikan validasi-validasi request.
Contoh : CreateRoleRequest.php yang extends FormRequest

Resources

Berisikan untuk kebutuhan API seperti JsonResource dan ResourceCollection.
Contoh : Property.php yang extends JsonResource

Rules

Rules berisikan validasi-validasi yang membutuhkan function agar tidak disatukan dengan validate pada requests.
Contoh : CheckPassword, dimana pada validate cukup dengan memanggil 'password' => ['required',new CheckPassword] dan function yang berjalan ada pada Rules/CheckPassword.php

Flow

Saat ada direct ke suatu Controller melalui Route dari view maka controller akan melakukan tugasnya dimana controller ini berisikan parameter Requests untuk memvalidasi data terlebih dahulu (pada requests boleh ditambahkan validasi Rule jika dibutuhkan). Controller berisikan application-application yang dibutuhkan dan mengembalikan return berupa json atau redirect route. Application sendiri memanggil repositories atau services yang dibutuhkan untuk suatu kegiatan. Repositories untuk pemanggilan data dan Services sendiri untuk proses penyimpanan database dan pengelolaan file storage, yang mana pada services juga bisa berisikan Event yang memanggil Listener-listenernya jika dibutuhkan. Jika membutuhkan Mail dan Notifications maka pada listenerlah tersimpan proses mail dan notification. Jika membutuhkan perubahan setelah proses saving, deleted dan lainnya maka gunakan Obervers yang didaftarkan pada AppServiceProvider.php untuk sebuah model (pada folder Entities).
Untuk API karena kita sudah mengimplementasikan applications maka yang berbeda hanya dari segi controller setelah memanggil application yang dibutuhkan maka selanjutnya mengembalikan return json.

Tidak ada cara membuat struktur DDD yang paling benar, struktur DDD tersebut hasil dari improvisasi belajar dan adaptasi. Semuanya kembali lagi ke kesepakatan tim.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment