repository pattern

Tutorial Menerapkan Repository Pattern di Laravel

Repository Pattern merupakan pola pendekatan yang memisahkan antara Business Logic dengan Query Logic.

Pada repository pattern Business Logic bertugas untuk melakukan implementasi proses bisnis dengan tujuan untuk mengatasi suatu permasalahan. Sedangkan Query Logic bertugas untuk berinteraksi dengan database untuk mengambil data atau mengirim data.

Adapun manfaat yaitu pendekatan ini sudah sesuai dengan kaidah Single Responsibility Principle yang terdapat pada prinsip S.O.L.I.D yang artinya setiap kelas hanya mempunyai satu tugas atau tanggung jawab saja.

Pada tutorial ini kita akan membuat sistem CRUD blog dengan menerapkan Repository Pattern di Laravel. Silahkan kalian ikuti langkah-langkah berikut ini.

Install Laravel

Langkah awal yaitu kita menginstall terlebih dahulu laravel-nya. disini kita akan menginstal versi terbaru dimana versi terbaru laravel saat ini yaitu laravel 10. Silahkan buka terminal kalian dan jalankan perintah berikut ini untuk menginstal laravel.

composer create-project laravel/laravel laravel_repository_pattern

Setelah berhasil menginstal laravel, langkah selanjutnya kita akan melakukan konfigurasi database pada file .env

DB_CONNECTION=mysql 
DB_HOST=127.0.0.1 
DB_PORT=3306 
DB_DATABASE=laravel_repository_pattern
DB_USERNAME=root
DB_PASSWORD=

Membuat Migration, Model, dan Controller

Kemudian pada langkah selanjutnya kita akan membuat migrasi, model, dan controller. dengan menggunakan perintah berikut.

php artisan make:model Blog -mcr

Selanjutnya silakan buka file migrasi yang dihasilkan di database/migrations/xxxx_xx_xx_xxxxxx_create_blogs_table.php.Kemudian tambahkan dengan kode berikut ini.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title', 100);
            $table->longText('body');
            $table->string('author', 100);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('blogs');
    }
};

Kemudian silakan buka file model yang dihasilkan di app/Models/Blog.php.Kemudian tambahkan dengan kode berikut ini.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    use HasFactory;

    protected $guarded = ['id'];
}

Menambahkan Routes

Langkah selanjutnya kita akan menambahkan rute ke file routes/web.php. Jadi, tambahkan kode berikut ini ke file tersebut.

<?php

use App\Http\Controllers\BlogController;


Route::resource('blogs', BlogController::class);

Membuat Folder Repository dan Interface

Kemudian kita buat terlebih dahulu struktur folder repository dan interfacenya. Silahkan kalian buat folder dengan nama Repositories di dalam folder app dan juga silahkan buat file dengan nama EloquentBlogRepository.php.

Setelah itu buat folder dengan nama interfaces di dalam folder Repositories yang baru dibuat dan juga silahkan buat file dengan nama BlogInterface.php.

Membuat Fungsi CRUD pada Repository dan Interface

Silahkan kalian buat interface dengan kode sebagai berikut.

App/Repositories/Interfaces/BlogInterface.php

<?php

namespace App\Repositories\Interfaces;

interface BlogInterface
{
    public function getBlog();
    public function storeBlog($request);
    public function findBlog($id);
    public function updateBlog($request, $id); 
    public function destroyBlog($id);
}

Kemudian untuk repository nya sebagai berikut ini.

App/Repositories/EloquentBlogRepository.php

<?php

namespace App\Repositories;

use App\Models\Blog;
use App\Repositories\Interfaces\BlogInterface;

class EloquentBlogRepository implements BlogInterface
{
    public function getBlog()
    {
        return Blog::latest('updated_at')->get();
    }

    public function storeBlog($request)
    {
        return Blog::create([
            'title'   => $request->title,
            'body'    => $request->body,
            'author'  => $request->author,
        ]);
    }

    public function findBlog($id)
    {
        return Blog::find($id);
    }

    public function updateBlog($request, $id)
    {
        $blog = Blog::where('id', '=', $id)->first();

        $blog->update([
            'title'   => $request->title,
            'body'    => $request->body,
            'author'  => $request->author,
        ]);
    }

    public function destroyBlog($id)
    {
        Blog::destroy($id);
    }
}

Kemudian langkah selanjutnya silahkan tambahkan bin BlogInterface dan EloquentBlogRepository di app/Providers/AppServiceProvider.php

app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\Interfaces\BlogInterface;
use App\Repositories\EloquentBlogRepository;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(BlogInterface::class, EloquentBlogRepository::class);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Menerapkan Repository Design Pattern di Controller

Baik, pada langkah selanjutnya kita bisa menerapkan repository design pattern yang kita buat di dalam controller. Silahkan kalian buka app/Http/Controllers/BlogController.php. Kemudian tambahkan dengan kode berikut ini.

<?php
namespace App\Http\Controllers;
use App\Models\Blog;
use Illuminate\Http\Request;
use App\Repositories\Interfaces\BlogInterface;

class BlogController extends Controller
{
    private $blogRepository;
    public function __construct(BlogInterface $blogRepository)
    {
        $this->blogRepository = $blogRepository;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $blogs =  $this->blogRepository->getBlog();
        return view('blogs.index', compact('blogs'));
    }
    
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('blogs.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->validate([
            'title'  => 'required',
            'body'   => 'required',
            'author' => 'required',
        ]);
        $this->blogRepository->storeBlog($data);
        return redirect()->route('blogs.index')->with('message', 'Blog Created Successfully');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Blog  $blog
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Blog  $blog
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $blog = $this->blogRepository->findBlog($id);
        return view('blogs.edit', compact('blog'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Blog  $blog
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate([
            'title'  => 'required',
            'body'   => 'required',
            'author' => 'required',
        ]);
        $this->blogRepository->updateBlog($request->all(), $id);
        return redirect()->route('blogs.index')->with('message', 'Blog Updated Successfully');
    }
    
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Blog  $blog
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $this->blogRepository->destroyBlog($id);
        return redirect()->route('blogs.index')->with('status', 'Blog Delete Successfully');
    }
}

Kesimpulan

Dalam artikel ini, kami telah menjelaskan langkah-langkah dalam menerapkan repository pattern di Laravel.

Dengan menerapakan repository pattern dapat memudahkan kita dalam melakukan develop kodingan karena sudah terstruktur.

Selamat mencoba menerapkan repository pattern dan jika ada pertanyaan kalian dapat komentar di bawah ini.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top