/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.)
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.
Folder domain adalah kunci utama kita membuat kode, folder ini mempresentasikan konsep, aturan dan logika bisnis.
Contoh: Activity, PropertyManagement, PaymentManagement, dll
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 berisikan query-query yang dibutuhkan oleh domain namun hanya untuk get data saja.
Contoh : byUserId(), isMeOwner() dan lainnya.
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 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.
Seperti contoh sebelumnya pada services, event berguna untuk mendefinisikan suatu event.
Contoh : BuyProduct.php
Seperti contoh sebelumnya, listener berguna untuk melakukan beberapa hal setelah eventnya berjalan.
Contoh : SendingEmail.php, SendToLog.php dan SendingSMS.php.
Application berisikan kebutuhan pemanggilan services ataupun repositories untuk menyusun flow suatu bisnis proses.
Contoh : PropertyDocumentApplication.php
Berisikan kebutuhan untuk mengirim email seperti judul, template dan dikirimkan ke siapa.
Contoh : UserRegister.php
Berisikan kebutuhan untuk notifikasi.
Contoh : PaymentFailedNotification.php
Infrastructure berisikan pemanggilan third-party dan beberapa kebutuhan utama lainnya.
Contoh : Doku (untuk pembayaran), Instagram (untuk auto posting) dan lainnya.
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 berisikan validasi-validasi request.
Contoh : CreateRoleRequest.php yang extends FormRequest
Berisikan untuk kebutuhan API seperti JsonResource dan ResourceCollection.
Contoh : Property.php yang extends JsonResource
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
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.