Why Do We Use the Repository Pattern?
Banyak developer perangkat lunak hanya berfokus pada menulis kode program saja, tanpa mempertimbangkan kualitas kodenya, dan seringkali tidak memikirkan bagaimana melakukan pemeliharaan terhadap kode yang sudah ditulis. Tetapi, penting bagi para developer untuk mempertimbangkan aspek pemeliharaan ini, karena tahap pemeliharaan biasanya akan menghabiskan lebih banyak waktu dan upaya daripada tahap pengembangan awal. Dalam konteks ini, Repository Pattern dapat muncul sebagai alternatif yang bermanfaat.
Repository Pattern adalah salah satu jenis design pattern yang banyak digunakan oleh para developer. Terdapat banyak jenis design pattern yang dirancang untuk membantu developer dalam menemukan solusi dari masalah-masalah umum yang muncul selama proses pengembangan perangkat lunak.
Design Pattern diciptakan untuk mengatasi masalah-masalah umum dan memberikan struktur yang teruji untuk mengembangkan aplikasi. Dalam hal ini, Repository Pattern dipilih karena dapat membantu mengelola operasi-operasi akses data dengan cara yang terstruktur.
Ketika kita mengembangkan aplikasi, sering kali kita menemui kesamaan dalam kode antara berbagai method. Repository Pattern membantu mengatasi masalah ini dengan memisahkan query logic ke dalam komponen terpisah, yang dikenal sebagai repository. Pendekatan ini mengurangi duplikasi kode dan memungkinkan developer lain untuk lebih mudah memahami dan bekerja dengan kode yang sudah ada.
Sebagian dari kita mungkin bertanya-tanya, Bagaimana Repository Pattern bekerja? Bagaimana cara mengimplementasikannya ke dalam kode kita? Sebelum kita memahami langkah-langkah pengimplementasian, penting bagi kita untuk memiliki pemahaman mengenai layer yang ada dalam Repository Pattern.
Layer pertama adalah User Interface, di mana interaksi langsung dengan pengguna terjadi. Layer ini akan dihandle oleh Controller Layer, sebagai layer yang mengumpulkan request dari pengguna dan menampilkan response kepada mereka. Kemudian, terdapat Service Layer yang mencakup business logic dan pemrosesan data. Layer ini memanfaatkan query logic untuk mengambil atau menyimpan data sesuai kebutuhan.
Di tengah-tengahnya, terdapat Repository Layer yang menghubungkan business logic dengan query logic. Layer ini menyajikan antarmuka untuk melakukan operasi terhadap data, memisahkan teknis akses data dari business logic yang lebih abstrak sehingga operasi-operasi seperti penyimpanan dan pengambilan data dari database dapat diatur.
Pada kesempatan ini, kita akan membahas langkah-langkah implementasi Repository Pattern dalam proyek Laravel. Sebelum kita mulai, mari kita perhatikan struktur direktori standar yang digunakan dalam proyek Laravel:
Struktur Direktori Laravel
/app
├── /Console
├── /Exceptions
├── /Http
| ├── /Controllers
| ├── /Middleware
├── /Models
├── /Providers
/bootstrap
/config
/database
├── /factories
├── /migrations
├── /seeders
/docker
/public
/resources
├── /css
├── /js
├── /views
/storage
/tests
/vendor
(Other files like .env, artisan, composer.json, etc.)
Setelah kita memahami struktur direktori dalam proyek Laravel, kita dapat langsung mencoba implementasi Repository Layer.
Buat Repository Layer
Langkah pertama adalah membuat direktori baru bernama Repositories di dalam direktori /app. Di dalam direktori ini, kita akan membuat file yang mewakili setiap repository yang akan kita gunakan dalam aplikasi. Misalnya, jika kita memiliki entitas Transaction, kita bisa membuat file TransactionRepositoryInterface.php dan TransactionRepository.php di dalam direktori /app/Repositories. TransactionRepositoryInterface.php berguna sebagai blueprint dari TransactionRepository.php
// /app/Repositories/TransactionRepositoryInterface.php
<?php
namespace App\Repositories;
interface TransactionRepositoryInterface
{
public function getAllTransactionByUserId(int $userId);
}
?>
Blueprint yang sudah dituliskan pada TransactionRepositoryInterface.php kita implementasi pada file TransactionRepository.php
// /app/Repositories/TransactionRepository.php
<?php
namespace App\Repositories;
use App\Models\Transaction;
use App\Repositories\TransactionRepositoryInterface;
class TransactionRepository implements TransactionRepositoryInterface
{
public function getAllTransactionByUserId(int $userId)
{
return Transaction::where('user_id', $userId)
->orderBy('date', 'desc')
->orderBy('updated_at', 'desc')
->cursorPaginate();
}
}
?>
Dalam contoh di atas, TransactionRepository memiliki method getAllTransactionByUserId yang berinteraksi dengan model Transaction yang ada dalam direktori /app/Models.
Buat Service Layer
Selanjutnya, kita akan menggunakan repository ini dalam Service Layer. Kita akan membuat Service Layer yang berfungsi sebagai perantara antara Repository Layer dan Controller Layer atau antarmuka pengguna.
Langkah selanjutnya adalah membuat direktori Services di dalam direktori /app. Di dalam direktori ini, kita akan membuat file TransactionService.php.
// /app/Services/TransactionService.php
<?php
namespace App\Services;
use App\Http\Requests\TransactionRequest;
use App\Repositories\TransactionRepositoryInterface;
use Illuminate\Support\Facades\Gate;
class TransactionService
{
private TransactionRepositoryInterface $transactionRepository;
public function __construct(TransactionRepositoryInterface $transactionRepository)
{
$this->transactionRepository = $transactionRepository;
}
public function getsTransactionByUserId(int $userId)
{
return $this->transactionRepository->getTransactionByUserId($userId);
}
}
?>
Dalam contoh di atas, TransactionService bertindak sebagai perantara antara Repository Layer dan Controller Layer. Ia mengambil operasi-operasi dari repository dan menyediakan method yang relevan dengan business logic.
Langkah terakhir kita implementasikan Service Layer ke dalam Controller Layer.
// /app/Http/Controllers/TransactionController.php
<?php
namespace App\Http\Controllers;
use App\Services\TransactionService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response;
class TransactionController extends Controller
{
private TransactionService $transactionService;
public function __construct(TransactionService $transactionService)
{
parent::__construct();
$this->transactionService = $transactionService;
}
public function index()
{
$transactions = $this->transactionService->getsTransactionByUserId(Auth::id());
return response()->json($transactions, Response::HTTP_OK);
}
}
?>
Dengan langkah-langkah di atas, kita telah berhasil mengimplementasikan Repository Pattern dalam proyek Laravel kita. Pendekatan ini memisahkan dengan jelas antara query logic, business logic, dan interface user, yang membuat pengelolaan kode, pemeliharaan, dan pengujian menjadi lebih mudah dan terstruktur.
Semoga tutorial yang singkat ini dapat bermanfaat bagi anda.