본문 바로가기
iaa.dev/Laravel8

Laravel 8 에서 Repository 패턴 사용하기

by chopper.kid 2022. 1. 21.

Repositories 디렉토리 작성

app디렉토리 아래에 Repositories 디렉토리 를 작성하고 그 아래로 Eloquent디렉토리를 추가로 작성

 

Base 인터페이스 와 Base repository 클래스 작성

app/Repositories 아래에 EloquentRepositoryInterface.php 파일 작성

<?php

namespace App\Repositories;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;

interface EloquentRepositoryInterface
{
    public function findById(int $id , array $columns = ['*'], array $relations = []): Model;

    public function all(array $columns = ['*'],array $relations=[]): Collection;

    public function create(array $payload): Model;

    public function update(int $id , array $payload): bool;

    public function delete(int $id): bool;

    public function paginate(int $perPages);

}

app/Repositories/Eloquent 아래에 BaseRepository.php 파일 작성

<?php

namespace App\Repositories\Eloquent;

use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Repositories\EloquentRepositoryInterface;

class BaseRepository implements EloquentRepositoryInterface
{

    private Model $model;

    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function findById(int $id, array $columns = ['*'], array $relations = []): Model
    {
        return $this->model->find($id, $columns);
    }

    public function all($columns = array('*'),array $relations=[]): Collection
    {
        return $this->model->with($relations)->get($columns);
    }

    public function create(array $attributes): Model
    {
        return $this->model->create($attributes);
    }

    public function update(int $id, array $attributes):bool
    {
        $model = $this->findById($id);
        return $model->update($attributes);
    }

    public function delete(int $id):bool
    {
        $model = $this->findById($id);
        return $model->delete();

    }

    public function paginate($perPages = 15)
    {
        return $this->model->paginate($perPages);
    }
}

UserRepositoryInterface.php 와 UserRepository.php 작성

app/Repositories 아래에 UserRepositoryInterface.php 파일 작성

<?php

namespace App\Repositories;
use App\Models\User;

interface UserRepositoryInterface extends EloquentRepositoryInterface
{


}

app/Repositories/Eloquent 아래에 UserRepository.php 파일 작성

<?php

namespace App\Repositories\Eloquent;

use App\Repositories\UserRepositoryInterface;
use App\Models\User;

class UserRepository extends BaseRepository implements UserRepositoryInterface
{
    protected $model;

    public function __construct(User $model)
    {
        parent::__construct($model);
    }

}

RepositoryServiceProvider 작성 및 바인딩

php artisan make:provider RepositoryServiceProvider

app/Providers/RepositoryServiceProvider 의 resiter 메소드에 바인딩 추가

 

## 상부에 추가
use App\Repositories\Eloquent\BaseRepository;
use App\Repositories\Eloquent\UserRepository;

use App\Repositories\EloquentRepositoryInterface;
use App\Repositories\UserRepositoryInterface;

    public function register()
    {
        $this->app->bind(EloquentRepositoryInterface::class, BaseRepository::class);
        $this->app->bind(UserRepositoryInterface::class, UserRepository::class);
    }

 

Config/app.php 에 추가

'providers' => [
.......
App\Providers\RepositoryServiceProvider::class,
.......
],

Controller 에 Dependency Injection 적용

use App\Repositories\UserRepositoryInterface;
#상부에추가


    private $modelRepository;
    public function __construct(UserRepositoryInterface $repository)
    {        
        parent::__construct();
        $this->modelRepository = $repository;
        $this->authorizeResource(User::class, 'user');
    }

그리고 각 메소드에서 리포지터리를 사용하도록 변경합니다.

    public function index()
    {
//        $models = User::paginate();
        $models = $this->modelRepository->paginate();
        \Debugbar::info($models);
        return view(
            "admin.users.index" ,
            [
                'models' => $models,
            ]
        );
    }

이런식으로....

 

이제 페이지로 가서 확인하면 리스트가 보이게 될겁니다.

 

비지니스 로직등을 별도의 Service 층에서 만드는것도 전체적인 구조가 복잡하냐 아니냐에 따라서 고려해보면 좋을듯합니다.

 

반응형
SMALL

댓글