Langsung ke konten utama

MEMBUAT VALIDATION & ERROR HANDLING

 

 VALIDATION & ERROR HANDLING

Kita akan membuat service menggunakan PHP Lumen yang bisa melakukan handling Validation dan Negative Case

Tujuan praktek ini adalah untuk :
1. Mampu implementasi validation menggunakan Lumen
2. Mampu melakukan Negative Case handling menggunakan Lumen
3. Mampu memberikan informasi yang baik dan relevan ketika mengalami error validasi dan error negative case

Endpoint

Saat ini kita sudah mengimplementasikan endpoint yang akan kita gunakan, yakni seperti ini:
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlgqLtBDhFOCp2fMCFlGPi4CWtBmOk1vXHmwyVoB4YhfCzvFH_Trc42hAGBZ_CHMUpkVYs8dW3afGwhFuLu9j66YE2DWJ_1vISVuLNIiZyUqkxtYfPbk9_Qvw6XzuGVWD8BR0GSaGVlZv/s640/Screenshot+%2528138%2529.png

Beautify Response Pada Fungsi Read All

Implementasi fungsi ini adalah fungsi index di PostsController.php :

 

1. Saat ini kalau kita memanggil endpoint http://localhost:8000/posts, maka tampilan

 

response nya akan menjadi seperti ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDAvwwewCGdMxlrB0WkXI0mYMaurQv37A7itIH2wVHIprGv3HY35fwYhXDXTEjARl7Wbn-hBbK284s7zese7kYiTbqhmgVR9sr2wT8Qi8GqGwFqw8UonfYprZjKjcohy0IYxhrI7fiMqDA/s640/Screenshot+%2528155%2529.png


2. Kalau melihat dari response nya ada beberapa data yang tidak kita perlukan, seperti:

first_page_url, from, last_page, to. Pertama kita akan mengubah response nya terlebih

dahulu.


3. Buka file app/Http/Controllers/PostsController.php, ubah function index menjadi seperti dibawah ini.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6em2c_cCwFjj327BNV8-r1E_H2-nQshxqS5JnFbQtiXvf-T5k_xKVys8_mFh5Pv6Vz5oN2BvYpZuyJghClaOaubSPTOBfauQEd6qKfdep6mdbpLUw-KuaAZpVVfs6b_FetMG1zzuu7kpx/s640/Screenshot+%2528164%2529.png
Pada baris dibawah ini, nilai 2 bisa anda ubah2. Nilai ini adalah berapa jumlah rows yang akan ditampilkan dalam satu halaman.

Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjagw3AufNz9FM2UFqJL49cDDRafGbhADHzauDblDW_SuljO2Ww9m8Gjiq3BimWqfWYZebuzXPmRE0lVTI7Fi6bYRs_8VN-X2RtQz8wRZ1qXEOWf1XREJrVX5ZH8zCWARTe0RcLjSYx1rSb/s640/Screenshot+%2528166%2529.png


4. Ketika kita panggil endpoint http://localhost:8000/posts, maka tampilanya seperti

dibawah ini.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmn8eaMdgzCxKVOyJpkMLhso7KQx08PW25VLrWOolJDydbSMheucTEX2IiKzqmDa4_fh5mRZAPvPtB-yaycThOJ3Ih6TZh73b9tQhihI3TA5wqUh0suclpqLnhU0aRN7ZAZ0JapomtZPOC/s640/Screenshot+%2528165%2529.png

Kita lihat sekarang response nya menjadi lebih clean, dan lebih nyaman untuk dibaca oleh programmer. Nilai dari next_page_url pada line 5 yakni http://localhost:8000/posts?page=2, ini adalah url untuk mendapatkan rows di halaman kedua. Untuk lanjut ke halaman ke-3 dan seterus nya, kita hanya perlu mengganti parameter page=[halaman].



 

5. Ketika kita panggil endpoint http://localhost:8000/posts?page=2, maka hasilnya harus

berbeda dengan endpoint http://localhost:8000/posts. Seperti dibawah ini. Kita lihat

value dari next_page_url pada line 5 adalah null, karena sudah tidak ada lagi rows yang

perlu ditampilkan di halaman berikut nya.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE3zOuhZKTqDt8DwlwfDTUnpmUvP4FPOpWgRERGpQ1WFuA3Yp2_aQEUYiCMiu0mwtOiv6z6j15MKMXoTimy6eF_Jn9e6B60X35v2mVN9ww6IzKX7xB7l6PIgLxLQSAYKFqliedsoZRkkii/s640/Screenshot+%2528157%2529.png

 




 

Validasi Fungsi Create

 

Untuk membuat validasi pada fungsi create, mari kita ikuti langkah-langkah berikut ini:

1. Saat ini fungsi create memiliki beberapa parameter, diantaranya adalah:

    - title

    - content

    - status

    - user_id

2. Parameter tersebut belum divalidasi, artinya semua nilai bisa kita masukan ke parameter

tersebut. Kalau kita coba untuk memberikan value ‘’ pada parameter tersebut, maka

aplikasi akan tetap melakukan INSERT ke database. Sekarang kita akan melakukan validasi

untuk parameter tersebut dengan rule seperti dibawah ini :

 

   - title:

     a. Tidak boleh kosong (required)

     b. Harus memiliki minimum 5 karakter

   - content:

     a. Tidak boleh kosong (required)

     b. Harus memiliki minimum 10 karakter

   - status:

     a. Tidak boleh kosong (required)

     b. Hanya bisa diisi oleh dua value ini: published dan draft

   - user_id:

     a. Tidak boleh kosong (required)

     b. Value yang di input harus ada di database table users

3. Itulah rule validasi yang akan kita implementasikan.

4. Kita akan melakukan pengecekan pada semua parameter, jika validasi lolos maka kita

akan melanjutkan untuk INSERT ke database.

5. Jika validasi tidak lolos, kita akan memberikan response error dengan status code 400

Bad Request.

 

Membuat Table users

Untuk membuat table users, mari kita ikuti langkah-langkah berikut ini:

1. Membuat database migration dengan menjalankan command dibawah ini pada terminal:

     php artisan make:migration create_users_table

2. Buka file database/migrations/...create_users_table.php, dan ubah menjadi seperti

dibawah ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUV7Of1m0axorU1JNunO0tW594K4-Rs-O0PG0XNGospt4_jdA0TmxiDCY4wJ3rWZfY0YCbzDQNBsBRnRfh-ZsHmCgW_RAWEc__mWcIn4umV5UU_SXbNWZRh1Vnzw6DRmaP6gwPZS7H0L2C/s640/Screenshot+%2528160%2529.png

3. Jalankan command dibawah ini pada terminal:

    php artisan migrate

4. Kemudian insert satu row ke table users

 

Implementasi Validasi Fungsi Create

Untuk implementasi validasi pada fungsi create, mari kita ikuti langkah-langkah berikut ini:

1. Buka file app/Http/Controllers/PostsController.php, ubah function store menjadi seperti dibawah ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLjVUFc2ij9e_uB2hY2EAh7PMOmiycimXy7cX-rT9mHZJ0FZrosgKzz5JfSef2eIqKL0HwQTKv-A4EcuX9dcQd1sVbF2ndsknBOXsBBiaAHoCZ_klzes9u-awSlBCPTGrpEqZureDv-ddV/s640/Screenshot+%2528164%2529.png

2. Kita coba dengan mengirimkan parameter null, seperti dibawah ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSTUyHWKaC1hva522IT-rjEGkowc6tChxebi197G1x2Ilo2tsacqyVBrmrjdr8dkYriNQWTHLL6K7RGMw0NzcLn7vF7AIJB2AHKyRC-kuhEwRamxhyiNb5BJavZ0j9IzMZMVX6OniPFQeW/s640/Screenshot+%2528169%2529.png

3. Kita coba dengan mengisi parameter yang tidak valid
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaaWSqHMOVzZhj8JLKeTF5zHYnkMzxMpmYG-6BHXMhDFt9G69M8RgR_gkrkjzCzcDT0KpRbxGQVV4gUrYJIK35EPYENnBqQCd0ez7RIQYncCp2MAhl4uOeS8RPzDkk2GJz2mttVm34lSgE/s640/Screenshot+%2528170%2529.png

4. Kita coba dengan mengisi parameter yang valid
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8o8QKBrzwMM4FuegVj_LgYcCx8DvHan9iYYNTuegJrYHAFlEUYS1Qh0MuAqVeAtTjii9Qs0W167EnCGTivUzAC1ADC-bFGCUeS1wlqWapglmnVy4TFfuVV4V6caHtSkW2c9EH6sD_VPOp/s640/Screenshot+%2528172%2529.png

 

 

Implementasi Validasi Fungsi Update

Untuk implementasi validasi pada fungsi update, mari kita ikuti langkah-langkah berikut ini :

1. Buka file app/Http/Controllers/PostsController.php, ubah function update menjadi seperti dibawah ini.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihvefDbJBb2BvBH3HeGe8MBsaqXPVrG9s-Jcdeaw2SScmR-pC25O056zOFKWIG-6O4yXvp-hQ0kcPEgEBmsiGESTQINI4WUNiCqHdvKT1Y6dmfD2kt56IVp44vEGXmjtIQ0CTvdgmNOU7p/s640/Screenshot+%2528176%2529.png

2. Kita coba kirim dengan value null
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMpyvihkukbQWhbV7d4EWbQ5FHWspzacuUwo-sIQrVsSGkb8wgG3oH2zeZqHlK112DbKTYU8ZMWcULpwcr8GnL8hR6SjXaFx3C71awL_rWHV_BMrwXWcy6yEhrD5Aa0tEBv4sx3aWDDO-N/s640/Screenshot+%2528177%2529.png
3. Kita coba dengan value yang tidak valid
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqYLTmF_j3c0QUt5xCDh2R-nWUhfvXh5o72eS0Dw8UiBJDfQZBv9nUy1Q-JfU5XoLMxC-ruwzR8J7ljNKmLwtjk0fDygs9HiN4IEMnWSj5DV0-uRGquT_8TVJAgtqSFw18ThSguvwdT6gX/s640/Screenshot+%2528174%2529.png
4. Kita coba dengan value yang valid
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwhnk1vxyRkgarwkD_SoASb_kPDtvh0pK8Jp60Z_78xRHYx3yUTAh0xCoSS4sCwRGwePgDbM-8KWr-bjjs5Zuye-ougxbqt_z31_QDsYiiuvdgg12xmQ3K7IG0Bb2q9_Ley8-E-CxLVl-n/s640/Screenshot+%2528175%2529.png

 

Gambaran Umum Error Handling

Saat ini kita hanya fokus pada positive case saja, kita belum memikirkan apabila ada negative case. Kita tidak menghiraukan apakah request parameter yang dikirim sudah sesuai dengan yang kita harapkan atau belum. Bagaimana seandainya user mengirim request dengan Method yang salah? Bagaimana apabila ID yang dikirim tidak ada di database ketika melakukan UpdateDelete atau Show? Pada dasarnya Lumen sudah menyediakan Error Handling untuk menangani masalah tersebut. Sebagai contoh, jika kita mengakses http://localhost:8000/posts/1 dengan method POST, maka Lumen akan mengembalikan error response Invalid Method seperti gambar dibawah ini.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbujryOgiPisJUurSwy6NMIsQPuhpGwqkUwZXhCKVHXJoy2YdrOFmFBH1828vuCOr_v4x4FNMFGTqxxji2e-c1sChs27I6WaFFmh1wsd0nx24d3WBUVf3SgU2wMRB6scbv9mVPGPMs2-P4/s640/Screenshot+%2528178%2529.png

 

Kenapa ini terjadi? Karena di file routes/web.php, kita mendefinisikan url ini

http://localhost:8000/posts/5 hanya menerima method GETPUT dan DELETE.

 

Error response yang diberikan oleh Lumen secara default dalam bentuk HTML. Sekarang kita akan melakukan Error handling dan memberikan response JSON.

 

Implementasi Error Handling

Untuk implementasi Error Handling, mari kita ikuti langkah-langkah berikut ini:

1. Sebetulnya kita sudah melakukan error handling, lihat pada function show, update dan

destroy, kita akan menemukan code seperti dibawah ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT5JDOaZe9L_vMys5z8QPAHz9k8M8bot3lX9BJTA3BHJp00ff3nvIQd__RhIr8Koxfo9WkfUBqeC0ZOXaSOmo1amyJ9Nzt_GbQ18rpdfxoK-FfMRKgWu8gYaV1WXzwRULy_bsnRvM-6ohl/s640/Screenshot+%2528180%2529.png

2. Fungsi abort(404) diatas (contoh pada function show) adalah salah satu implementasi

error handling. Hanya saja implementasi ini belum memberikan error response JSON,

masih berbentuk HTML yang merupakan fungsi bawaan dari Lumen.

3. Sebagai contoh kalau kita panggil endpoint GET http://localhost:8000/post/6, maka

tampilannya akan seperti ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNWXlViyllwCDIBgNiznKNLEPeJ-KxcK7A___Nb1NVMSVA4lk-3gW_WYTCw5Di8P3Qh0Ja_b-UbbN0HJiez2sKeXax7044NXjO5Z18AVxNivi-WCjch49pfxWiT4uEbFsx8qUFpQeAcmX7/s640/Screenshot+%2528179%2529.png

4. Sekarang kita akan mengubah response tersebut menjadi response dalam bentuk JSON.

5. Buka file app/Exceptions/Handler.php diatas Class definition tambahkan code dibawah

ini.
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-WCvuJThIN7DaQ2lX2glt9ZdSxPE1FGHVbPSJ8PFqX7Tf4Vewc3YeJQB-hrwvRn8IG2c1HVJ-RXZ5fbGmzCTnlUt-GXicn89g_IQhu1wvTzlhRnlrt5HU_bsc150Aw1cclRFMI398ec3l/s640/Screenshot+%2528181%2529.png

6. Buka file app/Exceptions/Handler.php ubah function render menjadi seperti dibawah ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2HVriI3e1l1YacRT21l4qh7Jb2jWWQQ3tNKJniICldNKv8h4bYcgiZaohw4wNIYTI_LbUwww_yGT96T3RWBo0MABuiAWj2DjKfCgr05SBIlDSR-vTMlPtJlPdXEXnJ-64OgzgkvUgqVIa/s640/Screenshot+%2528185%2529.png

7. Buka file .env ubah APP_DEBUG=true manjadi APP_DEBUG=false
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjopYf3h580HKJlR6j3CLI1NAndemfwrA_cWPgb3HtAZTD5U93hvaCalpm7KnRbcZquNW1zECaxppaPJ0jL4IqZSgniNVs-C40qp2U-NVqKsKZcU2WntIr9H0Sy3F6CcEWhmMeEO3YoiGfu/s320/Screenshot+%2528182%2529.png

8. Restart server

9. Ketika kita panggil endpoint POST http://localhost:8000/post/6, maka tampilannya

akan seperti ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBn4-SG3I9PA4t-mpo7LmOS4DMRcGdCzYaTpvyJXKfWapsaY8zLceWuxE85oUFDBmTBvCrj-jNd3l9F4dTl83Ek2BDrf5aP1T31l9xmMmFHXOjBNiaLqaLrE0WLw5VaHrdasA9wYIk5rMs/s640/Screenshot+%2528183%2529.png

10. kita panggil endpoint GET http://localhost:8000/post/6, maka tampilannya akan seperti ini :
Description: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA2ECb5Sylgb6wNQDB0PHS1WnQIDBiuubilLeDXIn0V0Q-iNHGNvuyqg7t0A_kxjYQm0JCtzO9CptSNTz-pONItmX3vJxyH0s04A8ScZBKkl6NEpWCrOSXzLGM_7gaO5lKPfFQVFovrkFr/s640/Screenshot+%2528184%2529.png

 

Komentar

Postingan populer dari blog ini

Membuat Lumen Uplod Media

Membuat Lumen Uplod Media Pada tutorial ini kita akan membahas mengenai upload media dan upload video kedalam tabel posts. Fitur upload Image di Post Untuk mengimplementasikan fitur upload image kita harus menambahkan satu field ke tabel posts. Caranya ketik di command Prompt /CMD : php artisan make:migration add_image_to_posts_table Selanjutnya buka filenya di Database/Migration/.. , dan tambahkan kode berikut: Selanjutnya ketik di command Prompt /CMD : php artisan migrate Dengan begitu sudah bertamah satu kolom/field di table posts. Selanjutnya buka file App/Http/Controllers/PostsController.php dan tambahkan kode berikut di function store : Silakan test di postman store dan isi form datany, dan jika berhasil maka responnya seperti ini. Fitur get image Post Pertama tambahkan kode di routes/web.php Selanjutnya tambahkan method baru "image" di App/Http/Controllers/PostsController.php. Kemudian lakukan test di postman get dengan parameter image name sesuai dengan nama image yan...

MEMBUAT PHP LUMEN API DOKUMENTATION

Membuat PHP Lumen Api Documentation  Mempersiapkan Docs Generator Untuk membuat docs generator kita akan menggunakan swagger-ui (  https://swagger.io/tools/swagger-ui/  ). Untuk membuatnya, silahkan ikuti langkah-langkah dibawah ini: Install swagger-php plugins di projek lumen-service kalian. Pada terminal/CommandPrompt ketik command dibawah ini. composer require zircote/swagger-php Jika sudah selesai selanjutnya buat artisan command file. Buat file di app/Console/Commands/SwaggerDocScanner.php. Lalu masukan kode di bawah ini. Buka file app/Console/Kernel.php, tambahkan code dibawah ini. Untuk menjalankan artisan command SwaggerDocScanner dan menggenerate docs, pada terminal/CommandPrompt jalankan command dibawah. Command ini akan membuat file public/swaggerdoc.json. Saat ini kalau dijalankan, command ini bakal error, karena kita belum mendefiniskan anotasi docs nya. php artisan swaggerdoc:scan Untuk tampilan User Interface nya kita perlu mebuat file html di public folder...

Apa itu interopabilitas

Interoperabilitas Adalah : Karakteristik, Kelebihan dan Kekurangannya Interoperabilitas adalah dimana suatu aplikasi bisa berinteraksi dengan aplikasi lainnya melalui suatu protokol yang disetujui bersama lewat bermacam-macam jalur komunikasi, biasanya lewat network TCP/IP dan protokol HTTP dengan memanfaatkan file XML. Aplikasi dapat ditempatkan pada platform yang berbeda: Delphi Win32, NET, Java atau bahkan pada sistem operasi yang berbeda. Kata “interoperabilitas” terdiri dari 3 kata, yaitu: “inter” yg artinya antar (beberapa hal), “operate” yg artinya bekerja, dan “ability” yg artinya kemampuan/kebisaan. Ketika digabungkan menjadi “interoperabilitas”, ini secara kasar berarti “kemampuan untuk bekerja di antara banyak hal” atau terjemahan gratis tentang “kemampuan untuk bekerja bersama di antara banyak hal”. Interoperabilitas merupakan kemampuan berbagai ragam sistem untuk bekerja sama dan kemampuan sebuah sistem untuk bekerja atau digunakan oleh sistem lain (Merriam Webster). Inter...