Laravel: Naik Level dari CRUD - Merancang Aplikasi yang Scalable dengan DTO

Halo, Rama di sini! đź‘‹ Di artikel kali ini, kita akan bahas tentang bagaimana membangun aplikasi Laravel yang lebih dari sekadar CRUD dasar. Kita akan menyelami Domain-Driven Design (DDD) dan penggunaan Data Transfer Objects (DTO) untuk aplikasi yang lebih terstruktur dan scalable.

Blog banner: Merancang Aplikasi Laravel yang Scalable dengan DTO

Domain-Driven Design (DDD): Memahami Inti Aplikasi

DDD adalah tentang memahami esensi dari aplikasi yang sedang kita bangun. Bayangkan seperti ini: alih-alih terpaku pada kode dan database, kita fokus pada "bahasa" bisnis yang ingin kita selesaikan.

Misalnya, di aplikasi perpustakaan, kita punya "Buku", "Anggota", dan "Peminjaman". Masing-masing punya aturan dan prosesnya sendiri. Di sinilah DDD membantu kita mengorganisir kode berdasarkan domain-domain ini, bukan hanya sekedar Controllers dan Models.

Data Transfer Objects (DTO): Mengalirkan Data dengan Rapi

DTO itu seperti wadah khusus untuk memindahkan data antar bagian aplikasi. Bayangkan, kita mau kirim data buku dari database ke tampilan website. Daripada melempar data mentah, DTO membantu kita membungkusnya dengan rapi dan aman.

Contohnya, DTO untuk buku bisa seperti ini:

class BookData
{
    public string $judul;
    public string $pengarang;
    public int $tahunTerbit;
}

Kenapa Pakai DTO?

  • Tipe Data Terjamin: DTO memastikan data yang dikirim sesuai jenisnya, mencegah error karena salah tipe.
  • Kode Lebih Mudah Dipahami: DTO membuat kode lebih rapi dan mudah dibaca.
  • Reusable: DTO bisa dipakai di berbagai bagian aplikasi, hemat kode!
  • Perawatan Mudah: Ubah struktur data? Cukup perbarui DTO-nya, tidak perlu ubah semua bagian kode.
  • Keamanan Data: DTO membantu mencegah perubahan data yang tidak diinginkan dengan bertindak sebagai "data contract" antara bagian-bagian aplikasi. Kita bisa menentukan properti apa saja yang bisa diakses dan dimodifikasi.
  • Validasi Terpusat: Alih-alih menyebar logika validasi di controller atau model, kita bisa memusatkannya di DTO. Ini membuat kode lebih mudah dipelihara dan diuji.

Mengimplementasikan validasi di StoreBookRequest (atau custom request class lainnya) memang lebih ideal.

1. Buat StoreBookRequest:

use Illuminate\Foundation\Http\FormRequest;

class StoreBookRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // Atau sesuaikan dengan logika authorization
    }

    public function rules(): array
    {
        return [
            'judul' => 'required|string|max:255',
            'pengarang' => 'required|string|max:255',
            'tahunTerbit' => 'required|integer',
        ];
    }

    public function toDto(): BookData
    {
        return new BookData(
            judul: $this->judul,
            pengarang: $this->pengarang,
            tahunTerbit: $this->tahunTerbit
        );
    }
}

2. Gunakan StoreBookRequest dan toDto di Controller:

use App\Http\Requests\StoreBookRequest;

class BookController extends Controller
{
    public function store(StoreBookRequest $request)
    {
        $bookData = $request->toDto();

        // ... gunakan $bookData untuk membuat dan menyimpan data buku
    }
}

Penjelasan:

  • Di StoreBookRequest, kita definisikan rule validasi di method rules().
  • Method toDto() bertugas membuat dan mengembalikan objek BookData yang sudah tervalidasi berdasarkan data dari request.
  • Di controller, kita inject StoreBookRequest. Laravel secara otomatis akan melakukan validasi, dan jika valid, kita bisa langsung menggunakan method toDto() untuk mendapatkan data yang siap pakai.

Dengan perubahan ini, kode kita jadi lebih rapi, validasi terpusat di request class, dan DTO tetap berperan penting dalam menjaga konsistensi data. đź‘Ť

DTO in Action: Contoh di Laravel

Misalnya, kita punya controller untuk menampilkan detail buku:

class BookController extends Controller
{
    public function show(Book $book)
    {
        $bookData = new BookData(
            judul: $book->judul,
            pengarang: $book->pengarang,
            tahunTerbit: $book->tahun_terbit
        );

        return view('books.show', compact('bookData'));
    }
}

Kita buat BookData DTO dari model Book dan kirim ke view. Controller jadi lebih bersih, dan view lebih mudah diatur.

Penutup

Dengan DDD dan DTO, kita bisa meningkatkan kualitas kode Laravel, membuatnya lebih mudah dikelola, dan meminimalisir error. Ini langkah penting untuk membangun aplikasi yang powerful dan mudah dikembangkan.

Di artikel berikutnya, kita akan bahas bagaimana menggunakan actions untuk merapikan logika bisnis di aplikasi Laravel. Stay tuned!