Skip to content

Repository 设计模式

👋🏼 您当前浏览的文档为 1.x

写在前面

TIP

需要在服务容器AppServiceProviderregister() 中绑定 Repository

$this->app->bind(IManage::class, ManageRepo::class);//管理员

建议新建一个服务类 RepositoryServiceProvider 用于专门管理Repository服务的绑定。保持整个编码风格的整洁。 甚至可以再按业务模块去区分provider,然后在主服务类中引入各业务模块的provider

创建一个新的provider和按业务拆分独立的provider的原因是:当项目越来越大的时候,绑定服务结构会变得非常凌乱。 设想下:每个模型都有自己的Repository,那么项目中的AppServiceProviderRepositoryServiceProvider可读性将会大大降低。

编写服务提供者

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());
    }
}

根据 MIT 许可证发布。