Repository là phần trung gian giữa dữ liệu và logic
class UsersController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', [
'users' => $users
]);
}
}
class UsersController extends Controller
{
private $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function index()
{
$users = $this->userRepository->all();
return view('users.index', [
'users' => $users
]);
}
}
Tạo thư mục Repository trong app như sau:
-- app
---- Repository
------ Eloquent
-------- UserRepository.php
-------- BaseRepository.php
------ UserRepositoryInterface.php
------ EloquentRepositoryInterface.php
Hiểu nôm na, BaseRepository và EloquentRepositoryInterface là các lớp cha chứa các methods được sử dụng phổ biến trong mọi repository. Trong đó, BaseRepository implements RepositoryInterface là nơi triển khai các phương thức như CRUD, còn RepositoryInterface là nơi khai báo các phương thức đó.
EloquentRepository.php
namespace App\Repository;
use Illuminate\Database\Eloquent\Model;
/
* Interface EloquentRepositoryInterface
* @package App\Repositories
*/
interface EloquentRepositoryInterface
{
/
* @param array $attributes
* @return Model
*/
public function create(array $attributes): Model;
/**
* @param $id
* @return Model
*/
public function find($id): ?Model;
}
...
BaseRepository.php
<?php
namespace App\Repository\Eloquent;
use App\Repository\EloquentRepositoryInterface;
use Illuminate\Database\Eloquent\Model;
class BaseRepository implements EloquentRepositoryInterface
{
/
* @var Model
*/
protected $model;
/
* BaseRepository constructor.
*
* @param Model $model
*/
public function __construct(Model $model)
{
$this->model = $model;
}
/
* @param array $attributes
*
* @return Model
*/
public function create(array $attributes): Model
{
return $this->model->create($attributes);
}
/
* @param $id
* @return Model
*/
public function find($id): ?Model
{
return $this->model->find($id);
}
...
}
php artisan make:provider RepositoryServiceProvider
public function register()
{
$this->app->bind(EloquentRepositoryInterface::class, BaseRepository::class);
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
Tiếp theo là khai báo Provider mà chúng ta vừa tạo ở config/app.php. Thêm vào 'providers' :
App\Providers\RepositoryServiceProvider::class
UserRepositoryInterface.php
<?php
namespace App\Repository;
use App\Model\User;
use Illuminate\Support\Collection;
interface UserRepositoryInterface
{
// Lấy tất cả users
public function all(): Collection;
}
UserRepository.php
<?php
namespace App\Repository\Eloquent;
use App\Model\User;
use App\Repository\UserRepositoryInterface;
use Illuminate\Support\Collection;
class UserRepository extends BaseRepository implements UserRepositoryInterface
{
/
* Hàm constructor.
*
* @param User $model
*/
public function construct(User $model)
{
// Khai báo model User
parent::construct($model);
}
/
* @return Collection
*/
public function all(): Collection
{
// Lấy hết các users
return $this->model->all();
}
}
UserController.php
class UsersController extends Controller
{
private $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function index()
{
$users = $this->userRepository->all();
return view('users.index', [
'users' => $users
]);
}
}
Như vậy, chúng ta đã tìm hiểu cơ bản về Repository và thực hành. Trong trường hợp không muốn triển khai Eloquent, chúng ta thay đổi App\Repository\Eloquent\UserRepository.php
ví dụ App\Repository\Mongo\UserRepository.php
. Mọi thứ vẫn sẽ hoạt động bình thường ngay cả khi chúng ta thay đổi về phía dữ liệu.
Đăng nhận xét