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.
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.
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.
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->boolean('status')->default(false);
$table->text('description')->nullable();
$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
1. Dengan mengunakan Repository Pattern, dapat memisahkan antara business logic dan data access logic. Repository Pattern akan melakukan abstraksi terhadap data access logic.
2. Dengan implementasi Repository Pattern, pengembangan perangkat lunak akan sesuai dengan kaidah SOLID.
3. Repository Pattern dapat mempermudah dalam proses pengembangan perangkat lunak.
4. Repository Pattern dapat diimplementasi pada berbagai macam bahasa pemrograman.
Jika Anda berminat mendalami tentang design pattern atau skill IT lainnya, jangan ragu untuk mengikuti pelatihan IT bersama SUHU. Silakan kontak kami di mail@suhu.co.id.
Written by :
Asdita Prasetya ( Software Engineer TLab)