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($mahasiswa200);

        }


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($mahasiswa200);

    }

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($post200);

        }

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($post200);

    }

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($post200);

 

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($post200);

        }

 

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($requestThrowable $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

Postingan populer dari blog ini

KONSEP, KELEBIHAN, KEKURANGAN CONTAINERIZATION BERSERTA TEKNOLOGI DAN STUDI KASUS CONTAINERIZATION

Mengapa Harus Belajar Cloud Computing ?

Setting Up VM and Domain