Repository 设计模式
👋🏼 您当前浏览的文档为 1.x
写在前面
TIP
需要在服务容器AppServiceProvider
类 register()
中绑定 Repository
$this->app->bind(IManage::class, ManageRepo::class);//管理员
建议新建一个服务类 RepositoryServiceProvider
用于专门管理Repository
服务的绑定。保持整个编码风格的整洁。 甚至可以再按业务模块去区分provider
,然后在主服务类中引入各业务模块的provider
。
创建一个新的provider
和按业务拆分独立的provider
的原因是:当项目越来越大的时候,绑定服务结构会变得非常凌乱。 设想下:每个模型都有自己的Repository
,那么项目中的AppServiceProvider
和RepositoryServiceProvider
可读性将会大大降低。
编写服务提供者
php artisan make:provider RepositoryServiceProvider
注册服务提供者
服务提供者都是通过配置文件 config/app.php
进行注册,只需要将服务添加到 providers
数组中
'providers' => [
// 其他服务提供者
App\Providers\RepositoryServiceProvider::class,
]
使用
Interfaces 接口继承
namespace App\Services\Repositories\Manage\Interfaces;
use JoyceZ\LaravelLib\Repository\Interfaces\BaseInterface;
/**
* 管理员
* Interface IManage
* @package App\Services\Repository\Manage\Interfaces
*/
interface IManage extends BaseInterface
{
}
实现 Interfaces 接口继承
namespace App\Services\Repository\Manage;
use App\Services\Models\Manage\ManageModel;
use App\Services\Repository\Manage\Interfaces\IManage;
use JoyceZ\LaravelLib\Repository\BaseRepository;
/**
* 管理员
* Class ManageRepo
* @package App\Services\Repository\Manage
*/
class ManageRepo extends BaseRepository implements IManage
{
public function __construct(ManageModel $model)
{
parent::__construct($model);
}
}
Repository 实现接口
注意事项:数据层,模型中要指定主键名称,部分实现的接口是直接通过模型设置指定的主键名称来操作数据层
根据主键id获取单条数据
/**
* 根据主键id获取单条数据
* @param int $id 主键id
* @return mixed
*/
public function getByPkId(int $id);
根据条件,获取一条指定字段数据
/**
* 根据条件,获取一条指定字段数据
* @param array $columns 要查询字段
* @param array $condition 查询条件
* @return mixed
*/
public function first(array $condition, array $columns = ['*']);
没有查找到单条数据,抛出异常
/**
* 没有查找到数据,抛出异常
* @param array $condition 查询条件
* @return mixed
*/
public function findOneOrFail(array $condition);
获取全部数据
/**
* 获取全部数据,不支持链表查询
* @param array $condition 查询条件
* @param array $columns 显示字段
* @param string $orderBy
* @param string $sortBy
* @return mixed
*/
public function all(array $condition = [], $columns = ['*'], string $orderBy = 'id', string $sortBy = 'asc');
创建一条数据,不联表状态
/**
* 创建一条数据,不联表状态
* @param array $attributes
* @return mixed
*/
public function doCreate(array $attributes);
根据主键id,更新一条数据
/**
* 根据主键id,更新一条数据,模型要设定指定主键id
* @param array $attributes 要更新的字段
* @param int $id 更新主键值
* @return mixed
*/
public function doUpdateById(array $attributes, int $id);
根据主键删除id
/**
* 根据主键删除id
* @param int $id
* @return bool
*/
public function deleteById(int $id): bool;
分页查询,不支持链表查询
/**
* 分页查询,不支持链表查询
* @param int $limit 一页最多显示多少条,默认一页查询15条数据
* @param array $columns 要查询的字段
* @param array $condition 查询条件
* @param array $orderBy 排序
* @param null $page 页码
* @param string $pageName
* @return mixed
*/
public function paginate($limit = 15, array $columns = ['*'], array $condition = [], array $orderBy = [], $page = null, $pageName = 'page');
根据主键,更新某个字段,模型要指定主键名
/**
* 根据主键,更新某个字段
* @param int $id 主键id值
* @param string $filedName 字段名称
* @param string $fieldValue 字段值
* @return mixed
*/
public function doUpdateFieldById(int $id, string $filedName, string $fieldValue);
统计数量
/**
* 统计数量
* @param array $condition
* @param string $pkId
* @return mixed
*/
public function count(array $condition = [], string $pkId = '');
解析数据,返回数组
解析单条数据
/**
* 解析一条业务数据
* @param array $row
* @return array
*/
public function parseDataRow(array $row): array;
解析N条数据
/**
* 解析多条业务数据格式,循环调用 parseDataRow 方法,只需要在具体的业务逻辑继承重写 parseDataRow 方法即可
* @param array $rows
* @return array
*/
public function parseDataRows(array $rows): array;
写在后面
为了不过重设计,我们在编写业务Repository
时,可无需单独编写一个Interface
来实现Repository
接口。
同时也无需编写provider
进行服务注册
Repository 类
namespace App\Services\Repositories\Student;
use App\Services\Models\Student\StudentModel;
use JoyceZ\LaravelLib\Repositories\BaseRepository;
class StudentTestRepo extends BaseRepository
{
public function __construct(StudentModel $model)
{
parent::__construct($model);
}
public function getStudentByTeacher()
{
return '这是测试';
}
}
Controller 类
namespace App\Http\Controllers\Home;
use App\Http\Controllers\Controller;
use App\Services\Repositories\Student\StudentTestRepo;
class Index extends Controller
{
public function index(StudentTestRepo $studentTestRepo)
{
dd($studentTestRepo->getStudentByTeacher());
}
}