1. 什么是仓储模式
仓储模式(Repository Pattern)是一种面向对象设计模式,主要用来解决领域对象与数据存储之间的耦合,同时它也可以更好地隔离领域层和数据访问层。
下面是仓储模式的主要组成部分:
领域对象:业务层的领域对象,通常是指数据库中的一个表对应的实体类
仓储接口:定义了对领域对象进行CRUD操作的方法
仓储实现:对仓储接口的具体实现
数据访问层:执行数据库操作的代码
1.1 为什么要使用仓储模式
在传统的开发中,业务逻辑和数据库操作是紧密耦合的,这会带来一些问题:
难以单元测试业务逻辑,因为需要连接到数据库
修改数据库结构会影响到业务逻辑的实现
多个业务逻辑之间难以复用数据库操作的代码
使用仓储模式可以解决这些问题,它把业务逻辑和数据库操作分离开来,让它们互相独立,同时也有利于代码的复用和维护。
2. Laravel 5中的仓储模式
Laravel虽然没有官方的仓储模式实现,但是可以借助服务容器和依赖注入来很方便地实现仓储模式。
2.1 创建仓储接口
Laravel中的仓储接口通常都定义在 app/Repositories 目录下,我们可以先创建一个名为 UserRepository 的仓储接口:
namespace App\Repositories;
interface UserRepository
{
public function all();
public function find($id);
public function create(array $data);
public function update(array $data, $id);
public function delete($id);
}
这个接口中定义了常用的CRUD方法,每个方法对应了一个对应的数据库操作。
2.2 实现仓储接口
接下来我们需要实现 UserRepository 接口,Laravel中的数据库操作通常都使用Eloquent ORM来实现。在 app/Repositories 目录下创建一个名为 EloquentUserRepository 的类,实现 UserRepository 接口:
namespace App\Repositories;
use App\User;
class EloquentUserRepository implements UserRepository
{
protected $model;
public function __construct(User $model)
{
$this->model = $model;
}
public function all()
{
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(array $data, $id)
{
$record = $this->model->find($id);
return $record->update($data);
}
public function delete($id)
{
return $this->model->destroy($id);
}
}
EloquentUserRepository 类中的所有方法都是对 UserRepository 接口中定义的方法的实现。同时,EloquentUserRepository 类通过构造函数依赖注入了 User 类的实例,这个实例会在调用方法的时候用到。
2.3 绑定到服务容器
现在我们需要将 UserRepository 接口和 EloquentUserRepository 类绑定到服务容器中,这样我们在控制器等地方就可以通过依赖注入来使用 UserRepository 接口了。
打开 app/Providers/AppServiceProvider.php 文件,修改它的 register 方法:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(App\Repositories\UserRepository::class, App\Repositories\EloquentUserRepository::class);
}
}
这个代码片段将 UserRepository 接口绑定到了 EloquentUserRepository 类,这样我们就可以在控制器等地方通过依赖注入 UserRepository,然后使用 UserRepository 中定义的方法来操作用户数据了。