TLabCircle
Published in

TLabCircle

Implementasi Repository Pattern dengan Laravel

Design pattern adalah suatu metode yang digunakan untuk menyelesaikan permasalahan yang berulang dan biasanya memiliki suatu pola dalam menyelesaikan masalah. Design Pattern dapat mempercepat pengembangan suatu perangkat lunak. Salah satu dari Design Pattern yang paling sering digunakan adalah Repository Pattern.

Saat ini saya memiliki YouTube Channel yang membahas tentang Software Engineering, silakan kunjungi Youtube channel Asdita Prasetya ️📽️💥

What is Repository Pattern?

Secara singkatnya Repository Pattern adalah suatu pendekatan yang memisahkan antara Business Logic layer dengan Data Access Logic layer.

Menggunakan repository pattern, business logic layer tidak harus tahu dari mana sumber data diambil atau ke mana data akan dikirim. Business logic layer hanya bertugas untuk melakukan implementasi proses bisnis yang ingin diselesaikan atau masalah yang seharusnya diselesaikan.

Repository Pattern

Proses yang berhubungan dengan pengambilan atau pengiriman data nantinya akan ditangani oleh Data Access Logic layer, yang mana juga bertugas untuk melakukan abstraksi query. Tujuannya untuk mengurangi kompleksitas dan memberikan keuntungan dalam reusability ketika harus menangani query yang kompleks.

Untuk memahami cara kerja Repository Pattern, dapat membuka link martinfowler.

Single Responsibility Principle

Pendekatan ini sesuai dengan kaidah Single Responsibility Principle pada SOLID. yang artinya setiap class atau fungsi haruslah memiliki satu tanggung jawab saja. Contoh ada class untuk mendefinisikan struktur data dan ada class untuk melakukan manipulasi data.

Suatu class atau fungsi tidak diperbolehkan untuk menjadi fungsi atau class yang palugada atau class yang mengerjakan banyak hal. Dalam suatu class method dan property harus bekerja sama untuk mengerjakan atau memecahkan satu permasalahan saja.

Implementasi Repository Pattern

Kali ini saya akan melakukan implementasi Repository Pattern dengan menggunakan Laravel versi 8. Project yang akan kita buat kali ini adalah aplikasi Todo list berbasis Restful API. Jika belum mengetahui apa itu Restfull API, dapat membaca terlebih dahulu artikel berikut.

Aplikasi Todo list berbasis Restful API

Fitur Utama

  1. Pengguna dapat melakukan CRUD Task.
  2. Pengguna dapat menandai task yang sudah selesai dikerjakan.
  3. Pengguna dapat menuliskan komentar di task yang telah dibuat.

Rancangan Database

Time to code

Buatlah project Laravel baru dengan versi Laravel sesuai keinginan, saya sarankan untuk menggunakan Laravel versi 5 ke atas. Buatlah migrasi, model dan controller untuk tabel task, untuk mempermudah dapat menggunakan command di bawah ini:

php artisan make:model -mc

Jika berhasil, akan ada 3 file baru yaitu file model, migration dan controller. Buatlah file migrasi sesuai diagram tabel yang ada di atas atau dapat menggunakan fungsi berikut.

public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('name', 150);
$table->text('description')->nullable();
$table->boolean('status')->default(false);
$table->timestamps();
});
}

Langkah selanjutnya adalah buka folder “app” lalu buat folder bernama “Repository”. Folder ini akan menyimpan berbagai repository yang akan digunakan. Setelah itu buat folder “Task” di dalam folder “Repository”, folder ini akan menyimpan seluruh Repository yang berhubungan dengan Task. Jika dilihat maka struktur folder “app” akan menjadi seperti ini.

app
├───Console
├───Exceptions
├───Http
│ ├───Controllers
│ └───Middleware
├───Models
├───Providers
├───Repository --> Folder untuk menyimpan Repository
└───Task
└───Utils

Membuat Interface Repository

Untuk melakukan proses code-decoupling maka dibuat interface yang nantinya akan diimplementasi oleh kelas yang berhubungan dengan fitur yang ingin menggunakan repository pattern.

Interface menjadi kontrak bagi child class-nya sehingga memberikan keleluasaan dalam pemilihan mekanisme Data Access Logic. Misal menggunakan Eloquent maka buat kelas “EloquentTaskRepositoy” sebagai child dari “TaskRepository”, atau menggunakan Elasticsearch maka dapat membuat class dengan ElasticsearchTaskRepository sebagai child dari “TaskRepository”. Pada implementasi kali ini akan menggunakan Eloquent sebagai data access logic. Pada folder “Task” buat 2 file yaitu TaskRepository.php dan EloquentTaskRepositoy.php.

//interface TaskRepository TaskRepository.php
namespace App\\Repository\\Task;
interface TaskRepository
{
public function createTask(Request $request);
public function getTasks();
public function getTasksById($id);
public function updateTask(Request $request, $id);
public function setAsFinish($id);
}
//EloquentTaskRepositoy EloquentTaskRepositoy.php.
class EloquentTaskRepository implements TaskRepository
{
...
public function updateTask(Request $request, $id)
{
$task = Task::whereId($id)->first();
if ($task != null) {
$task->update([
'name' => $request->name,
'description' => $request->description,
]);
return $task;
}
return null;
}
...
}

Kita berhasil menambahkan layer baru menggunakan Repository Pattern. Langkah terakhir adalah dengan implementasi di controller.

use App\Repository\Task\EloquentTaskRepository;
use App\Utils\Response;
class TaskController extends Controller
{
use Response;
protected $eloquentTask;
public function __construct(EloquentTaskRepository $eloquentTask) {
$this->eloquentTask = $eloquentTask;
}
public function tasks(){
$tasks = $this->eloquentTask->getTasks();
if (!$tasks->isEmpty()){
return $this->responseDataCount($tasks);
}
return $this->responseDataNotFound('Data yang diminta tidak tersedia');
}
public function getTasksById($id){
$task = $this->eloquentTask->getTasksById($id);
if (!empty($task)){
return $this->responseData($task);
}
return $this->responseDataNotFound('Data yang diminta tidak tersedia');
}
}

Menggunakan objek dari “EloquentTaskRepository”, controller dapat fokus hanya untuk menulis business logic, query akses database yang panjang dan rumit sudah di enkapsulasi pada “EloquentTaskRepository”. Sampai sini implementasi Repository Pattern telah selesai.

Source code dapat diakses melalui Github.

Kesimpulan

  • Dengan mengunakan Repository Pattern, dapat memisahkan antara business logic dan data access logic. Repository Pattern akan melakukan abstraksi terhadap data access logic.
  • Dengan implementasi Repository Pattern, pengembangan perangkat lunak akan sesuai dengan kaidah SOLID.
  • Repository Pattern dapat mempermudah dalam proses pengembangan perangkat lunak.
  • Repository Pattern dapat diimplementasi pada berbagai macam bahasa pemrograman.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store