PHP LUMEN VALIDATION & ERROR HANDLING
PHP LUMEN VALIDATION & ERROR HANDLING
1. Endpoint
Saat ini kita sudah mengimplementasikan endpoint yang
akan kita gunakan, yakni seperti ini:
Method (HTTP Verbs)
|
Endpoint |
Description |
GET |
/posts |
Get list of all post |
GET |
/post/{postId} |
Get single post |
POST |
/users |
Create new post |
PUT |
/post/{postId} |
Update single post |
DELETE |
/post/{postId} |
Delete single post |
2. Beautify Response Pada Fungsi Read All
Implementasi
fungsi ini adalah fungsi index di MahasiswaController.php:
1) Saat
ini kalau kita memanggil endpoint http://localhost:8000/posts, maka tampilan
response nya akan menjadi seperti ini.
//Read data
public function index()
{
$mahasiswa = Mahasiswa::OrderBy("id", "ASC")->paginate(10);
$output = [
'message' => 'mahasiswas',
'results' => $mahasiswa
];
return response()->json($mahasiswa, 200);
}
1) Kalau melihat response
nya ada beberapa data yang tidak penting seperti first_page_url, from,
last_page, to. Pertama kita akan mengubah response terlebih dahulu.
2) Buka file
app/Http/Controllers/MahasiswaController.php,
ubah function index menjadi seperti dibawah ini. -> pagination(2), nilai 2
bisa anda ubah 2. Nilai ini adalah berapa jumlah rows yang akan ditampilkan
dalam satu halaman.
public function index()
{
$mahasiswa = Mahasiswa::OrderBy('id', 'ASC')->paginate(2)->toArray();
$mahasiswa = [
'total_count' => $mahasiswa['total'],
'limit' => $mahasiswa['per_page'],
'pagination' => [
'next_page' => $mahasiswa['next_page_url'],
'current_page' => $mahasiswa['current_page']
],
'data' => $mahasiswa['data']
];
return response()->json($mahasiswa, 200);
}
3) Ketika kita panggil endpoint http://localhost:8000/posts , maka tampilanya seperti dibawah ini. Kita lihat sekarang response nya menjadi lebih clean, dan lebih nyaman untuk dibaca oleh programmer.
1) 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.
3.
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:
a. nim
b. nama
c. jurusan
d. alamat
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 db.
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.
4. Membuat Table User
Buat table user dengan cara : php
artisan make:migration User
di file migration pada public function up() tuliskan code
seperti dibawah ini :
public function up()
{
Schema::create('users', function(Blueprint $table){
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique()->notNullable();
$table->string('password');
$table->timestamps();
});
}
lalu migrate : php artisan migrate
5. Implementasi Validasi Fungsi Create
Untuk
implementasi validasi pada fungsi create, ikuti langkah langkah dibawah ini :
1)
Buka
file app/http/Controller/MahasiswaController.php ubah
fungsi seperti di bawah ini:
Sebelum :
public function storeData(Request $req)
{
$input = $req->all();
$post = Mahasiswa::create($input);
return response()->json($post, 200);
}
Setelah
:
public function storeData(Request $request)
{
$input = $request->all();
$validationRules = [
//'id' => 'required|exists:id',
'nim' => 'required|min:5',
'nama' => 'required|min:3',
'jurusan' => 'required|min:5',
'alamat' => 'required|min:5'
];
$validator = \Validator::make($input, $validationRules);
if($validator->fails()) {
return response()->json($validator->errors(), 400);
}
$post = Mahasiswa::create($input);
return response()->json($post, 200);
}
2)
Coba dengan mengirimkan parameter null, seperti dibawah ini:
3)
Kita coba dengan mengisi parameter yang valid
6. Implementasi Validasi Fungsi Update
Untuk implementasi validasi pada fungsi update, mari kita
ikuti langkah-langkah berikut ini:
1) Buka
file app/Http/Controllers/MahasiswaController.php, ubah function update menjadi
seperti dibawah ini :
public function updateData(Request $request, $id)
{
$input = $request->all();
$validationRules = [
'nim' => 'required|min:5',
'nama' => 'required|min:3',
'jurusan' => 'required|min:5',
'alamat' => 'required|min:5'
];
$validator = \Validator::make($input, $validationRules);
if($validator->fails()) {
return response()->json($validator->errors(), 400);
}
$post = Mahasiswa::create($input);
return response()->json($post, 200);
7. 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 Update, Delete 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.
Kenapa ini terjadi? Karena
di file routes/web.php, kita mendefinisikan url ini
http://localhost:8000/posts/1 hanya menerima method
GET, PUT dan DELETE.
$router->get('/mahasiswa', 'MahasiswaController@index');
$router->get('/mahasiswa/{id}', 'MahasiswaController@showData');
$router->post('/mahasiswa', 'MahasiswaController@storeData');
$router->post('/mahasiswa/{id}', 'MahasiswaController@updateData');
$router->delete('/mahasiswa/{id}', 'MahasiswaController@deleteData');
Error response yang diberikan oleh Lumen secara default dalam bentuk HTML. Sekarang kita akan melakukan Error handling dan memberikan response JSON.
8. Implementasi Error Handling
Untuk implementasi
error handling, ikuti langkah-langkah berikut ini :
1) Sebetulnya
disini saya sudah melakukan error handling seperti dibawah ini:
public function showData($id)
{
$post = Mahasiswa::find($id);
if(!$post){
abort(400);
}
return response()->json($post, 200);
}
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/10 , maka tampilannya akan seperti ini:
1) Sekarang
kita akan mengubah response tersebut menjadi response dalam bentuk json.
2) Buka
file app/Exceptions/Handler.php diatas Class definition tambahkan code dibawah
ini. Line 12-15.
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Http\Exception\HttpResponseException;
use Illuminate\Http\Response;
lalu ubah
function render yang ada di file tersebut seperti dibawah ini:
public function render($request, Throwable $exception)
{
// return parent::render($request, $exception);
if(env('APP_DEBUG')) {
return parent::render($request, $exception);
}
$status = Response::HTTP_INTERNAL_SERVER_ERROR;
if($exception instanceof HttpResponseException) {
$status = Response::HTTP_INTERNAL_SERVER_ERROR;
} elseif ($exception instanceof MethodNotAllowedHttpException) {
$status = Response::HTTP_METHOD_NOT_ALLOWED;
$exception = new MethodNotAllowedHttpException([], 'HTTP_METHOD_NOT_ALLOWED', $exception);
} elseif ($exception instanceof NotFoundHttpException) {
$status = Response::HTTP_NOT_FOUND;
$exception = new NotFoundHttpException('HTTP_NOT_FOUND', $exception);
} elseif ($exception instanceof AuthorizationException) {
$status = Response::HTTP_FORBIDDEN;
$exception = new AuthorizationException('HTTP_FORBIDDEN', $status);
} elseif ($exception instanceof \Dotenv\Exception\ValidationExcetion && $exception->getResponse()) {
$status = Response::HTTP_BAD_REQUEST;
$exception = new \Dotenv\Exception\ValidationException('HTTP_BAD_REQUEST', $status, $exception);
} elseif ($exception) {
$exception = new HttpException($status, 'HTTP_INTERNAL_SERVER_ERROR');
}
return response()->json([
'success' => false,
'status' => $status,
'message' => $exception->getMessage()
], $status);
}
3) Buka file .env ubah APP_DEBUG=true menjadi APP_DEBUG=FALSE
Restart Server
Ketika kita panggil endpoint POST http://localhost:8000/post/10 , maka tampilannya akan seperti ini
kita panggil endpoint GET http://localhost:8000/post/10 , maka tampilannya akan seperti ini:
Komentar
Posting Komentar