LARAVEL

Laravel Repository Pattern

February 10, 2024 14 min read

Introduction

The Repository Pattern creates an abstraction layer between your application logic and data access. This makes your code more testable, maintainable, and flexible.

Benefits

  • Abstraction - Decouple business logic from data access
  • Testability - Easy to mock repositories for testing
  • Flexibility - Change data sources without changing business logic
  • Organization - Centralize data access logic

Implementation

// app/Repositories/UserRepository.php

namespace App\Repositories;

use App\Models\User;

class UserRepository
{
    protected $model;
    
    public function __construct(User $model)
    {
        $this->model = $model;
    }
    
    public function getAll()
    {
        return $this->model->all();
    }
    
    public function find($id)
    {
        return $this->model->find($id);
    }
    
    public function create(array $data)
    {
        return $this->model->create($data);
    }
    
    public function update($id, array $data)
    {
        $record = $this->find($id);
        $record->update($data);
        return $record;
    }
    
    public function delete($id)
    {
        return $this->model->destroy($id);
    }
}

Using Interfaces

// app/Repositories/Contracts/UserRepositoryInterface.php

namespace App\Repositories\Contracts;

interface UserRepositoryInterface
{
    public function getAll();
    public function find($id);
    public function create(array $data);
    public function update($id, array $data);
    public function delete($id);
}

// Binding in Service Provider
$this->app->bind(
    UserRepositoryInterface::class,
    UserRepository::class
);

Practical Examples

// Using in a Controller
class UserController extends Controller
{
    public function __construct(
        private UserRepositoryInterface $users
    ) {}
    
    public function index()
    {
        return view('users.index', [
            'users' => $this->users->getAll()
        ]);
    }
    
    public function store(Request $request)
    {
        $this->users->create($request->validated());
    }
}

Summary

The Repository Pattern provides a clean abstraction over your data layer. Use interfaces to define contracts and implement them with concrete classes for different data sources.

For more Laravel tutorials, see Service Container & DI.