Implementasi pipeline pattern untuk query filter pada laravel
Halo semuanya, apa kabar? Semoga semua dalam keadaan baik ya. Kali ini kita akan membahas mengenai cara membuat query filter dengan menerapkan Pipeline Pattern pada Laravel.
Query filter sebenarnya adalah penyebutan lain dari query scope, hanya saja dibuat terpisah dari model dengan harapan akan membuat isi file model lebih bersih. Pipeline pattern adalah sebuah konsep dimana request data yang diterima akan diproses layaknya melalui pipa (pipe).
Dalam operasi CRUD, query filter ini bisa digunakan dalam Read atau jika dalam Laravel digunakan pada method Index pada Controller.
Project Study
Kita akan melakukan implementasi pada project untuk menampilkan daftar produk melalui REST API. Kita menggunakan Laravel versi 8.75 dan akan membagi tahapannya menjadi 3 bagian besar.
A. Persiapan
- Membuat Migration
- Membuat Model
- Membuat Factory
- Membuat Seeder
- Membuat API Resource
- Membuat Controller Product
- Membuat route untuk API
B. Membuat Query Filter
- Abstract Filter
- Sort Filter
- Search Filter
- MinPrice Filter
- MaxPrice Filter
C. Menggunakan Query Filter
- Membuat method untuk memanggil Query Filter pada model
- Memanggil method Query Filter dari model pada controller
Untuk struktur file dan direktori akan seperti ini :
A. Persiapan
Tahap persiapan dilakukan untuk membuat struktur dasar dari project yang kita buat, mulai dari membuat migration sampai dengan API route.
- Membuat Migration
Untuk melakukannya kita bisa menggunakan perintah artisan berikut :
php artisan make:migration create_products_table
Kemudian kita perlu mengubah isinya menjadi seperti berikut :
Setelah membuat migration nya kita bisa melakukan pembuatan table dengan menggunakan perintah :
php artisan migrate
2. Membuat Model
Langkah selanjutnya adalah membuat model. Kita bisa melakukannya dengan menggunakan perintah artisan berikut :
php artisan make:model Product
3. Membuat Factory
Setelah membuat model kita akan membuat factory yang akan digunakan untuk membuat data dummy yang kita gunakan dalam seeder.
Untuk membuat factory bisa menggunakan perintah artisan berikut :
php artisan make:factory ProductFactory
Kemudian ubah isinya menjadi seperti berikut :
4. Membuat Seeder
Berikutnya kita perlu membuat seeder dengan perintah artisan berikut :
php artisan make:seeder ProductSeeder
Lalu ubah isinya menjadi seperti berikut :
Setelah membuat factory dan seeder kita bisa melakukan seeding dengan menggunakan perintah :
php artisan db:seed --class=ProductSeeder
5. Membuat API Resource
Kemudian kita akan membuat Resource atau API Resource dengan menggunakan perintah artisan :
php artisan make:resource Api/ProductResource
Kemudian ubah isinya menjadi seperti berikut :
6. Membuat Controller Product
Setelah itu kita akan membuat controller Product dengan perintah artisan :
php artisan make:controller Api/ProductController
7. Membuat route untuk API
Terakhir, kita perlu membuat route API. Caranya dengan menambahkan route product pada routes/api.php sehingga akan menjadi seperti berikut :
B. Membuat Query Filter
Kita akan membuat 1 class sebagai abstract class dan 4 class untuk query filter. Karena secara bawaan pembuatan query filter ini tidak bisa dibuat melalui command artisan, maka kita perlu membuatnya secara manual. Kita perlu membuat direktori QueryFilters di dalam direktori app kita. lalu di dalamnya kita akan membuat abstract class dan juga direktori Product.
- Abstract Filter
Kita akan membuat abstract class yang ada dalam direktori QueryFilters dengan isi file sebagai berikut :
Abstract Class ini akan memuat method yang akan diturunkan kepada class filter yang lain.
2. Sorting Filter
Selanjutnya kita akan membuat filter untuk melakukan sorting, yang ada dalam direktori QueryFilters/Product dengan isi file sebagai berikut :
Sorting sebenarnya bukan bagian dari filter, tapi biasa dipakai juga dalam request untuk mendapatkan list data. Filter Sorting ini untuk mengurutkan data berdasar suatu kolom pada table. Untuk nama kolomnya sendiri diambil dari value pada query parameter sort_by, jika disertakan. Jika tidak disertakan params sort_by maka data diurutkan berdasarkan id.
3. Search Filter
Kemudian kita akan membuat filter untuk melakukan search, yang ada dalam direktori QueryFilters/Product dengan isi file sebagai berikut :
Filter Searching ini untuk menyaring data berdasarkan kolom name pada tabel.
4. MinPrice Filter
Selanjutnya kita akan membuat filter untuk melakukan penyaringan berdasar harga terendah, yang ada dalam direktori QueryFilters/Product. Untuk nama filter yang terdiri dari lebih dari 1 kata, maka dituliskan dalam format PascalCase. Isi dari file sebagai berikut :
Filter MinPrice ini untuk menyaring data yang memiliki harga minimal seperti yang ditentukan.
5. MaxPrice Filter
Terakhir, kita akan membuat filter untuk melakukan penyaringan berdasar harga tertinggi, yang ada dalam direktori QueryFilters/Product. Karena nama filter-nya dari lebih dari 1 kata, maka dituliskan dalam format PascalCase. isi Isi dari file sebagai berikut :
Filter MaxPrice ini untuk menyaring data yang memiliki harga minimal seperti yang ditentukan.
C. Menggunakan Query Filter
Setelah selesai membuat query filter, maka kita tinggal menggunakannya dengan membuat method pada model dan memanggil method tersebut dari controller.
- Membuat method untuk memanggil Query Filter pada model
Kta akan untuk menggunakan pipeline untuk “mengirim” request data melalui query filter yang telah dibuat. Kita akan menambahkan property $filters dan method getAll seperti berikut :
2. Memanggil method Query Filter dari model pada controller
Selanjutnya kita perlu memanggil method dari model tadi dari controller. Untuk itu kita perlu mengubah pada method index menjadi seperti berikut :
Pengujian
Setelah selesai kita bisa melakukan pengujian dengan menggunakan browser atau REST API client. Untuk mengaktifkan filter ini kita perlu menyertakan filternya sebagai query parameter.
Untuk menggunakan filter kita perlu menyertakan nama filter dalam format snake_case. Berikut adalah hasil pengujian yang dilakukan menggunakan Postman :
Penutup
Pada kesempatan kali ini kita telah belajar membuat Query Filter untuk operasi Read (Index) dengan mengimplementasikan Pipeline Pattern. Dengan demikian diharapkan akan lebih mudah untuk memahami alur pemrosesan dari request pada bagian filtering dan akan membuat model menjadi lebih bersih. Semoga tulisan kali ini bermanfaat. Sampai jumpa di tulisan selanjutnya. Salam.