arsitektur aplikasi monitor produksi konveksi

Membuat API user address dengan Framework Lumen | Bagian 2

Hai geeker, bagaimana kabarnya ?

Sebelumnya saya membahas tentang mengenal frawork Lumen, kali ini saya akan mengajak geeker untuk implementasi pembuatan service API dengan framework lumen.

Goals

Service ini nantinya akan mendukung penyimpanan identitas rumah’ dari user. Membuat API service CRUD seperti modul Province, Districts, Subdistricts, Village, dan Address.

Relasi antar tabel alamat dengan user
  1. User memiliki hanya memili 1 customer address (sementara). Customer address ini nantinya untuk menampung data address_id dan user_id.
  2. Model address untuk menampung data turunan-turunannya seperti province, districts, sub-districts, dan village.
  3. Masing – masing province, districts, sub-districts, dan village hampir sama datanya yang membedakan relasinya saja.

Membuat Service API

Sebelum mengikuti tutorial ini saya harap kalian sudah belajar dan mengerti membuat aplikasi dari framework Laravel. Pertama kita ketikan code sebagai berikut

composer create-project laravel/lumen convection_backend --prefer-dist

Tunggu sampai instalasi selesai, langkah selanjutnya konfigurasi .env di root aplikasi kalian sesuaikan server MySQL.

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=tailor
DB_USERNAME=root
DB_PASSWORD=

Migration

Kemudian ketikan perintah diterminal kalian untuk membuat table province dan melakukan migrate, disini saya menggunakan terminal bawaan VScode ya…

Migration untuk membuat table province

Setelah migration berhasil, kemudian kalian buka file database/migrations/2020_10_17_115730_create_province_tables.php. Samakan kode sebagai berikut:

    public function up()
    {
        Schema::create('province', function (Blueprint $table) {
            $table->id();
            $table->string('name')->nullable();
            $table->timestamps();
        });
    }

Kemudian lakukan migrate dengan perintah artisan sebagai berikut.

Models

Langkah selanjutnya kita akan men-define model yang nantinya kita jadikan penggunaan antar tabelnya. Buat file Province.php didalam folder app/models, kemudian isikan file dengan code sebagai berikut.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Province extends Model
{
    protected $table = 'province';
    protected $fillable = [
      'name'
    ];
}

Disini saya tidak akan menjelaskan secara detail fungsi code. Kemudian kita buat Controller yang nantinya untuk menjalankan fungsi CRUD-nya.

Controller

Buka folder app/Http/Controller lalu buat file ProvinceController.php. Tuliskan code sebagai berikut :

<?php

namespace App\Http\Controllers;

use App\Helpers\ResponseHelper;
use App\Http\Controllers\Controller;
use App\Models\Province;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ProvinceController extends Controller
{
    private $response;

    public function __construct(ResponseHelper $response)
    {
        $this->response = $response;
    }

    public function index(Request $request)
    {
        $province = Province::latest();
        if ($request->name) {
            $province->search("$request->name");
        }
        $province = $province->paginate();
        return $this->response->successResponse($province);
    }
    
    public function show($province)
    {
        $province = Province::findOrFail($province);
        
        try {
            return $this->response->successResponse($province);
        } catch (\Exception $e) {
            DB::rollback();
            return $this->response->failedResponse($e);
        }
    }

    public function create(Request $request)
    {
        $this->validateRequest($request);
        $data = $request->all();
        try {
            ;
            DB::beginTransaction();
            $province = new Province;
            $province->fill($data);
            $province->save();
            DB::commit();

            return $this->response->successResponse($province);
        } catch (\Exception $e) {
            DB::rollback();
            return $this->response->failedResponse($e);
        }
    }
    
    public function update(Request $request, $province)
    {
        $this->validateRequest($request);
        $data = $request->all();
        try {
            ;
            DB::beginTransaction();
            $province = Province::findOrFail($province);
            $province->update($data);
            DB::commit();

            return $this->response->successResponse($province);
        } catch (\Exception $e) {
            DB::rollback();
            return $this->response->failedResponse($e);
        }
    }

    public function destroy($province)
    {
        $province = Province::findOrFail($province);
        $province->delete();
        return $this->response->successResponse($province);
    }

    function validateRequest($request)
    {
        $this->validate($request, [
            'name' => 'required|unique:province'
        ]);
    }
}

Keterangan : kode diatas saya buat function validationRequest, ini difungsikan sebagai validation request contoh name dengan aturan harus diisi dan unique:province untuk meminimalisir duplicate name. Kemudian untuk create function saya menggunakan params $request dan mendefinisikan dengan $request->all() agar tidak memperbanyak line.

Disini saya menggunakan konsep Eloquent ORM dari Laravel yang mempersingkat query istilahnya simple Active Record, kalian juga dapat mempelajari disini.

Route

Selanjutnya kita bikin file province.php di folder routes/. kemudian tuliskan kode berikut :

<?php $router->group(['prefix' => 'province'], function () use ($router) {     $router->post('/', ['uses' => '[email protected]']); }); 

Didalam route province saya menerapkan konsep RESTful API agar nantinya mudah dibaca dan maintenance . Nah sebelum kita testing create terlebih dahulu kita configuration sedikit, kalian buka file app.php difolder bootstrap pada bagian ini.

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    $router->group(['prefix' => 'api'], function () use ($router) {
         $router->get('/', ['uses' => '[email protected]']);
         $router->get('/{province}', ['uses' => '[email protected]']);
         $router->post('/', ['uses' => '[email protected]']);
         $router->post('/{province}', ['uses' => '[email protected]']);
         $router->delete('/{province}', ['uses' => '[email protected]']);

    });
});

return $app;

Kemudian ubah kode menjadi sebagai berikut :

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    $router->group(['prefix' => 'api'], function () use ($router) {
        require __DIR__. '/../routes/province.php';
    });
});

return $app;

Testing

Kemudian uncomment $app->withFacades() dan $app->withEloquent(). Selanjutnya kita lakukan pengetesan di Postman, jalankan terlebih dahulu server aplikasi dengan menuliskan perintah diterminal.

php -S localhost:8003 -t public
Testing create province using a postman
Testing create province

Testing read berdasarkan pagination
Testing read berdasarkan pagination
Testing read detail province
Testing read detail province

Sedangkan untuk testing delete tidak saya tampilkan karena kemungkinan besar bisa berhasil.

Modul districts, sub-district, village, address

Langkah – langkah diatas akan membantu kalian di pembuatan modul – modul ini. Saya akan memberikan garis besar apa yang harus dirubah karena function hampir mirip yang membedakan adalah :

  1. Pemanggilan Controller dan Model
  2. Route prefix
  3. Relasi antar tabel
Gambaran relasi table address

Controller

Disini saya akan menghiglight beberapa code yang harus diubah:

......
// Create Function
public function create(Request $request, $province)
    {
        $this->validateRequest($request);
        $data = $request->all();
        $province = Province::findOrFail($province);
        try {
            ;
            DB::beginTransaction();
            $districts = new District;
            $districts->fill($data);
            $districts->province()->associate($province->id);
            $districts->save();
            DB::commit();

            return $this->response->successResponse($districts);
        } catch (\Exception $e) {
            DB::rollback();
            return $this->response->failedResponse($e);
        }
    }
......

Params $province sebagai pengecekan id province dengan function $province = Province::findOrFail($province) kemudian untuk menyambungkan table district dengan table province menggunakan associate method. Sehingga dalam model province dan model district harus men-define relationship. Controller sub-district dan village hampir sama.

Kemudian migration untuk membuat table dan column. Tuliskan perintah dan lakukan migrate, sebagai berikut:

....

public function up()
    {
        Schema::create('districts', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('province_id')->unsigned();
            $table->string('name')->nullable();
            $table->foreign('province_id')->references('id')->on('province')->onDelete('cascade');
            $table->timestamps();
        });
    }

....

Tambahkan code line di model Province, sebagai berikut :

....

public function districts()
    {
      return $this->hasMany('App\Models\Districts');
    }

....

Menambahkan code line di model district, sebagai berikut :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class District extends Model
{
    protected $table = 'districts';
    protected $fillable = [
      'name'
    ];

    public function province()
    {
        return $this->belongsTo(Province::class);
    }
}

Klik disini melihat kode lengkapnya

Kalian tuliskan code pada bootstrap/app.php.

....
 require __DIR__. '/../routes/districts.php';
 require __DIR__. '/../routes/subdistricts.php';
 require __DIR__. '/../routes/village.php';
 require __DIR__. '/../routes/address.php';
....

folder routes/

file bootstrap/app.php

....
 require __DIR__. '/../routes/districts.php';
 require __DIR__. '/../routes/subdistricts.php';
 require __DIR__. '/../routes/village.php';
 require __DIR__. '/../routes/address.php';
....

Sampai disini artikel yang saya bikin, jika ada yang kurang jelas bisa ditanyakan maupun saran kalian bisa tinggalkan pesan dibawah artikel ini.

Next artikel kita akan fokuskan users service.

Geekgarden adalah salah satu perusahaan yang menyediakan jasa pembuatan platform dan konsultan sistem informasi maupun konsultan aplikasi dengan harga jasa pembuatan sistem informasi yang lebih terjangkau dan standar biaya pembuatan aplikasi sesuai dengan kualitas.

Referensi:

https://laravel.com/docs/8.x/eloquent

Tinggalkan Balasan