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
'iaa.dev > Laravel8' 카테고리의 다른 글
Laravel 8 - Eager Loading 과 dynamic property (0) | 2022.01.27 |
---|---|
Laravel 8 - 인스톨할 만한 Package 리스트 (0) | 2022.01.26 |
Laravel 8 - 소셜로그인(Laravel Socialite) - 1 (1) | 2022.01.14 |
Laravel 8 관리자 화면 - CRUD 생성,수정,삭제 기능 (1) | 2022.01.10 |
Laravel 8 Paginator 를 Bootstrap 에서 사용시 (0) | 2022.01.09 |
댓글