Membuat Repository Pattern Laravel 5.7

Membuat Repository Pattern Laravel 5.7

Pendahuluan

Laravel hadir dengan berbagai fitur beserta kemudahan yang ditawarkan guna mempercepat proses development, namun bukan berarti hal itu membuat kita menjadi programmer "pemakai" tanpa memikirkan dan belajar lagi konsep yang bagus agar aplikasi yang kita buat lebih maintenable.

Simulasinya, sebut saja kita punya sebuah aplikasi dimana salah satu fiturnya adalah management user. Bayangannya, kita memiliki sebuah model dengan nama User.php yang berfungsi untuk memanipulasi data dari table users. Model ini digunakan dalam banyak method yang ada, bukan hanya pada module management user saja, dimana salah satu fungsi yang banyak digunakan digunakan adalah mengambil data user berdasarkan ID, maka tentu saja codingan-nya akan terlihat seperti berikut:

User::find($id);

Suatu ketika terjadi perubahan dalam pengambil data, sebut saja filter data-nya berdasarkan email jadi tidak lagi menggunakan ID. Sehingga codingan-nya akan kita ganti menjadi:

User::where('email', $email)->get();

Baca Juga: Membuat Aplikasi Invoice Laravel 5.7 #6: Laporan

Make Repository

Tidak ada yang salah dengan cara yang kita lakukan diatas, sebab tujuannya akan tercapai. Akan tetapi cara tersebut tidak maintenable, sehingga query yang sama akan kita tuliskan secara berulang diberbagai method yang membutuhkan logic yang sama.

Dengan menggunakan Repositories, maka query tersebut dapat kita pisahkan menjadi satu bagian sehingga dapat digunakan berkali-kali pada berbagai kesempatan dan berbagai method yang diinginkan tanpa harus menuliskan query yang sama berulang kali.

Ada beberapa contoh yang akan kita buat, yakni: get data dan show data berdasarkan ID dan email. Pertama, buat file UserRepository.php didalam folder app/Repositories, kemudian tambahkan codingan berikut:

<?php

namespace App\Repositories;

//PANGGIL MODEL USER
use App\User;

class UserRepository
{
	protected $user;

	public function __construct(User $user)
	{
        //Instance model User ke dalam property user
	    $this->user = $user;
    }
    
    //MEMBUAT FUNGSI UNTUK MENGAMBIL DATA YANG TELAH DI PAGINATE
    //DAN DIFUNGSI INI TELAH DIURUTKAN BERDASARKAN CREATED_AT
    //FUNGSI INI MEMINTA PARAMETER JUMLAH DATA YANG AKAN DITAMPILKAN
    public function getPaginate($per_page)
    {
        return $this->user->orderBy('created_at', 'DESC')->paginate($per_page);
    }

    //MEMBUAT FUNGSI UNTUK MENGAMBIL DATA BERDASARKAN ID
	public function find($id)
	{
		return $this->user->find($id);
	}

    //MEMBUAT FUNGSI UNTUK MENGAMBIL DATA BERDASRAKAN COLOMN YANG DITERIMA
	public function findBy($column, $data)
	{
		return $this->user->where($column, $data)->get();
	}
}

Sebelum menggunakan Repository yang telah dibuat diatas, terlebih dahulu kita buat seeders untuk men-generate data dummy. Buka file database/seeds/DatabaseSeeder.php, kemudian modifikasi menjadi:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        factory(App\User::class, 50)->create();
    }
}

Kemudian jalankan command:

php artisan migrate --seed

Data dummy yang akan digunakan telah siap, tiba saatnya untuk menggunakan repository yang telah dibuat sebelumnya. Generate controller dengan command:

php artisan make:controller UserController

Buka file app/Http/Controllers/UserController.php, kemudian tambahkan code berikut:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//PANGGIL UserRepository YANG TELAH DIBUAT
use App\Repositories\UserRepository;

class UserController extends Controller
{
    protected $user;

    public function __construct(UserRepository $user)
    {
        //Instance repository UserRepository kedalam property $user
        $this->user = $user;
    }

    //METHOD INI BERFUNGSI UNTUK MENAMPILKAN DATA
    public function index()
    {
        //KARENA UserRepository TELAH ADA DIDALAM PROPERTY $user
        //MAKA PENGGUNAANNYA ADALAH $this->user->namaMethod()
        //DALAM HAL INI KITA AKAN MENGGUNAKAN getPaginate()
        //DIMANA METHOD INI MEMINTA PARAMETER JUMLAH DATA YANG AKAN DITAMPILKAN
        return $this->user->getPaginate(10);
    }

    //METHOD INI BERFUNGSI UNTUK MENAMPILKAN DATA YANG TELAH DIFILTER
    public function show($params)
    {
        //JIKA PARAMETER YANG DITERIMA BUKA NUMERIC
        if (!is_numeric($params)) {
            //MAKA MENGGUNAKAN METHOD findBy()
            //DENGAN MENGIRIMKAN PARAMETER YANG DIINGINKAN
            //UNTUK DIGUNAKAN MEMFILTER DATA
            return $this->user->findBy('email', $params);
        }
        //JIKA DIA ADALAH NUMERIC
        //MAKA MENGGUNAKAN METHOD find()
        //DENGAN MENGIRIMKAN ID YG AKAN DITAMPILKAN
        return $this->user->find($params);
    }
}

Terkahir buat routing dengan memodifikasi file routes/web.php, kemudian tambahkan code berikut:

Route::get('/user', 'UserController@index');
Route::get('/user/{params}', 'UserController@show');

Maka apabila diajalankan dengan mengakses url: http://namadomain.test/user, hasil yang akan diperoleh akan tampak seperti ini

laravel repository pattern

Adapun url: http://namadomain.com/user/idatauemail, maka hasilnya adalah

laravel repository pattern

Note: Angka 2 dapat diganti dengan email.

Baca Juga: Berkenalan Dengan Python

Kesimpulan

Mubassir tidak hanya berlaku pada makanan, seperti pada umumnya kata tersebut sering disematkan. Namun mubassir juga bisa berlaku dalam hal menuliskan codingan, maka sebaiknya dalam menuliskan codingan perlu diperhatikan efektif dan efisiensi dari codingan tersebut. Potongan code yang dapat digunakan kembali dengan logic yang njelimet dapat dipisahkan kedalam ruang khusus sehingga kapanpun dibutuhkan kembali, kita tidak perlu "berpikir" lagi.

Hal ini tentu saja akan membuat hasil karya yang kita buat lebih maintenable, sehingga apabila terjadi perubahan dikemudian hari tidak membuat kita jadi putus asa dalam memaintenance-nya.

Ohya dokumentasi codingan ini dapat kamu lihat di Github.

Category:
Share:

Comments