Share, Read & Learn

Brief Understanding on Laravel Repository Pattern Design

1 455

In this article, we will discuss the “Laravel Repository Pattern Design”. Using the Repository Pattern, we will add an extra layer between application logic and database. Assume, you want to change your DB from Mysql to MongoDB or anything else. Then Repository Pattern is much beneficial, application logics remain the same and all you have to do is change out the repository.

I’m assuming that you are familiar with the Laravel so I’m not describing the basic installation and other steps here. If you are not familiar with Laravel, then you can start with the following articles.

How to install Laravel 5 with Xampp using Composer

Setup Virtual Host in Windows with Xampp Server

Understanding Laravel Middleware

Create Repository

We’re going to refactor our app to use the Repository Pattern. The first step is to create a file for “app/Repositories/Repository.php”.

<?php 
namespace App\Repositories;

use Illuminate\Database\Eloquent\Model;

class Repository implements RepositoryInterface
{
    // model property on class instances
    protected $model;

    // Constructor to bind model to repo
    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    // Get all instances of model
    public function all()
    {
        return $this->model->all();
    }

    // create a new record in the database
    public function create(array $data)
    {
        return $this->model->create($data);
    }

    // update record in the database
    public function update(array $data, $id)
    {
        $record = $this->find($id);
        return $record->update($data);
    }

    // remove record from the database
    public function delete($id)
    {
        return $this->model->destroy($id);
    }

    // show the record with the given id
    public function show($id)
    {
        return $this->model-findOrFail($id);
    }

    // Get the associated model
    public function getModel()
    {
        return $this->model;
    }

    // Set the associated model
    public function setModel($model)
    {
        $this->model = $model;
        return $this;
    }

    // Eager load database relationships
    public function with($relations)
    {
        return $this->model->with($relations);
    }
}

In the above mention code snippet, we define our Repository class. Instances of this class have a model property that we tie to an Eloquent model. Once this is bound in the constructor we can call Eloquent methods like find, create, update or all from the class methods.

Create Interface

Now time to implements RepositoryInterface”. It adds an extra layer of structure to our code. An interface is a contract that defines the methods a class MUST have defined. In our case the interface looks like this:

<?php 
namespace App\Repositories;

interface RepositoryInterface
{
    public function all();

    public function create(array $data);

    public function update(array $data, $id);

    public function delete($id);

    public function show($id);
}

If we make new Repositories that implement this interface we’ll always know these methods are defined. Interfaces provide structure so we know what our code needs to do.

Use the Repository in the controller

In our PostController.php file, we instantiate a repository and pass in the Post model to it.

<?php

namespace App\Http\Controllers;

use App\Post;
use App\Repositories\Repository AS Repo;
use Illuminate\Http\Request;

class PostController extends Controller
{
    // space that we can use the repository from
    protected $model;

    public function __construct(Post $post)
    {
        // set the model
        $this->model = new Repo($post);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return $this->model->all();
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'post_title' => 'required',
            'post_content' => 'required|max:1000'
        ]);
 
        // create record and pass in only fields that are fillable
        return $this->model->create($request->only($this->model->getModel()->fillable));
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        return $this->model->show($id);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function edit(Post $post)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  post id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        // update model and only pass in the fillable fields
       $this->model->update($request->only($this->model->getModel()->fillable), $id);

       return $this->model->find($id);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  post id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        return $this->model->delete($id);
    }
}

The Laravel service container will automatically resolve our dependencies and inject them into the controller instance. I recommend you to check the Laravel documentation once for more deep understanding.

In the end everything ready, we have implements the Repository Pattern in Laravel. So go ahead and test your own. Please feel free to ask your query in the comment section, and also send me your feedback 😉

You may like:

Laravel Scout with TNTSearch Driver

Brief Understanding on Laravel Observers

How to Use Make Auth in Laravel 6

How to Setup Lets Encrypt a Free SSL Certificate

Leave A Reply

Your email address will not be published.

1 Comment
  1. Guill says

    Wow your tutorial is very good.
    Thank you.