🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> 主要讲解controller目录,每个controller有自己独立的路由,配置,事件,容器,控制器中可用框架核心及扩展。每个控制器其实就是一个独立的控制类。 请求流程大致分为以下流程,依次从左到右 ![](https://img.kancloud.cn/75/5c/755cbdef4fce9c0c4cd5f74f6bbf99f5_1395x113.png) ## Middleware 中间件分为前置和后置中间件. 前置中间件在访问控制器之前会被执行调用,通常用来拦截参数,跨域配置,多语言加载,Session初始化,权限验证,登陆验证等处理; 而后置中间件属于返回数据后在执行的中间件,用来做一些返回数据后需要执行的任务等业务逻辑 下面以前置中间件为例:文件存放目录 app/应用名/middleware/AuthMiddleware.php ``` <?php namespase app\应用名\middleware; use crmeb\interfaces\MiddlewareInterface; class AuthMiddleware implements MiddlewareInterface { public function handle(Request $request, \Closure $next) { //这里可以设置请求header //可以写权限验证 //验证失败直接可以抛出异常中止请求 if(false) { throw new AuthException('无权验证'); } return $next($request); } } ``` ## Controller 每个控制器负责相关业务的请求接收,只做最基本的数据接收,并调用相关的sevices业务处理层,返回数据。 例如: ``` <?php 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->search($where, $page, $limit); return app('json')->success($data); } } ``` --- ## Repository 所有的业务都在Repository层中处理,Repository层调用dao层,【注意:每个独立的services层只能调用对应的dao层,不能调用其他模型dao层。 比如:repository/user/UserRepository.php中只能调用dao/user/UserDao.php,无法调用 dao/order/StoreOrderDao.php。要想调用其他模型数据, 只能在UserServices.php中调用services/order/StoreOrderServices.php的方法来实现其他模型数据调用】。 例如: ``` <?php 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 search(array $where, int $page, int $limit) { $list = $this->dao->getList($where,'*',$page,$limit); $count = $this->dao->count($where); return compact('count','list'); } } ``` --- ## Dao dao层中主要用于当前模型基本的数据处理方法。dao层中调用对应的model,同样无法跨层调用。 例如: ``` <?php namespace app\dao\user; use app\dao\BaseDao; use app\model\user\User; /** * 用户 * Class UserDao * @package app\dao\user */ class UserDao extends BaseDao { protected function setModel(): string { return User::class; } public function getOne($uid) { return $this->where(['uid' => $uid])->field('username,phone')->find(); } } ``` --- ## Model model主要用于实例化数据表,只做相关数据表的基础设置,搜索器,设置器及表关联等操作。 ``` <?php namespace app\model\user; use crmeb\basic\BaseModel; use think\Model; /** * Class User * @package app\model\user */ class User extends BaseModel { /** * @var string */ protected $pk = 'uid'; protected $name = 'user'; protected $insert = ['add_time', 'add_ip', 'last_time', 'last_ip']; protected $hidden = [ 'add_ip', 'account', 'clean_time', 'last_ip', 'pwd' ]; /** * 自动转类型 * @var string[] */ protected $type = [ 'birthday' => 'int' ]; protected $updateTime = false; /** * 修改器 */ protected function setAddTimeAttr($value) { return time(); } /** * 关联订单 * @return User|\think\model\relation\HasMany */ public function order() { return $this->hasMany(StoreOrder::class, 'uid', 'uid'); } /** /** * 搜索器 用户uid * @param Model $query * @param $value */ public function searchUidAttr($query, $value) { if (is_array($value)) $query->whereIn('uid', $value); else $query->where('uid', $value); } } ```