🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Repository * ## 定义 ### 目录 ``` \app\common\repository ``` >具体repository下在分块,可以根据不同功能划分;默认这里创建的services所有应用都可以使用,如果不同应用想单独创建repository,请在应用目录下创建repository目录,再具体实现不同repository类 repository是具体实现某个特定功能,比如用户的列表查看搜索、用户注册、登录等等都是具体功能 ``` repository<->dao<->model<->table ``` 和UserDao对应UserRepository,只需要在构造方法中注入UserDao就可以 ``` namespace app\common\repositories\user; use app\common\dao\user\UserDao; class UserRepository extends BaseRepository { protected $dao; public function __construct(UserDao $dao) { $this->dao = $dao; } public function getList(array $where, int $page, int $limit) { $query = $this->dao->search($where); $list = $query->page($page,$limit)->select(); $count =$query->count(); return compact('count','list'); } } ``` 每一个小的功能都可以定义为一个实现方法,比如:设置默认地址 ``` /** * 设置默认定制 * @param int $uid * @param int $id * @return bool */ public function setDefault(int $uid, int $id) { if (!$this->getAddress($id)) { return false; //'地址不存在'; } if (!$this->dao->update($uid, ['is_default' => 0], 'uid')) return false; //'取消原来默认地址'; if (!$this->dao->update($id, ['is_default' => 1])) return false; //'设置默认地址失败'; return true; } ``` 如果添加一个的地址,并选择了默认地址选项,则在添加的地址方法中调用`setDefault`方法 ``` public function add($uid,$data) { $data['uid] = $uid; $res = $this->dao->save($data); if(!$res) return false; if($data['is_default] == 1){ $this->setDefault($uid,$res['id]); } return true; } ``` >可以按照需要把不同功能点拆分为每一个方法,以实现代码的最大复用,不用重复造轮子 * ## 使用 repository可以在控制器中,也可以不同repository之间互相调用(实现某一个复杂功能逻辑) ### 控制器中使用 也是在构造方法中注入当前repository,比如UserControlle注入 UserRepository ``` namespace app\controller; use app\Request; use app\common\repositories\user\UserRepository; class User { protected $repository; public function __construct(App $app, repository $repository) { parent::__construct($app); $this->repository = $repository; } public function lst($cid) { [$page, $limit] = $this->getPage(); $where = $this->request->params(['id']); $data = $this->repository->getList($where, $page, $limit); return app('json')->success($data); } } ``` 使用UserRepository具体方法可以使用`$this->repository` ``` $this->repository->search(); ``` ### 控制器中方法注入 某个特定方法注入某个repository ``` /** * 记录用户分享 * @param Request $request * @return mixed */ public function user_share(Request $request, UserBillRepository $services) { $uid = (int)$request->uid(); return app('json')->successful($services->setUserShare($uid)); } ``` UserBillServices用来记录每一次分享 ### 不同services之间互相调用 首先引入需要使用的repository >使用`app()->make()`来创建repository类的实例 `app()->make()`使用: ``` /** @var UserReposotiroy $user */ $user = app()->make(UserReposotiroy::class); ```