控制器
控制器概述
控制器是MVC架构中的核心组件,负责接收请求、处理业务逻辑(通常通过调用Service层)、并返回响应结果。
控制器目录结构
主要包含两种类型的控制器:管理后台API控制器和前端API控制器。
目录分布
niucloud/
├── app/
│ ├── adminapi/controller/ #管理后台API控制器
│ ├── api/controller/ #前端API控制器模块化组织
两种类型的控制器均按功能模块进行分组,每个目录对应一个业务模块:
adminapi控制器模块(部分):
addon/: 插件管理相关接口member/: 会员管理相关接口site/: 站点管理相关接口sys/: 系统管理相关接口wechat/: 微信相关接口
api控制器模块(部分):
member/: 会员中心相关接口pay/: 支付相关接口weapp/: 微信小程序相关接口wechat/: 微信相关接口
控制器类层次结构
采用继承机制构建控制器体系,通过基类提供通用功能,子类专注于具体业务实现。
基础控制器
BaseController是所有控制器的基类,定义在core/base/BaseController.php中,提供了控制器的基础功能:
abstract class BaseController
{
protected $request; // Request实例
protected $app; // 应用实例
protected $batchValidate = false; // 是否批量验证
protected $middleware = []; // 控制器中间件
// 构造方法
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
$this->initialize();
}
// 初始化方法(子类可重写)
protected function initialize() {}
// 数据验证方法
protected function validate(array $data, $validate, array $message = [], bool $batch = false) {}
}应用控制器
基于基础控制器,派生出两类应用控制器:
管理后台控制器基类:BaseAdminController,位于core/base/BaseAdminController.php,用于管理后台API控制器继承
class BaseAdminController extends BaseController
{
public function initialize()
{
}
}API控制器基类:BaseApiController,位于core/base/BaseApiController.php,用于前端API控制器继承
class BaseApiController extends BaseController
{
public function initialize()
{
}
}业务控制器
业务控制器继承自对应的应用控制器基类,实现具体的业务逻辑,例如:
管理后台插件控制器:app/adminapi/controller/addon/Addon.php
通过继承BaseAdminController,自动实现了权限和路由的控制。调用Service方法直接返回给api接口。
namespace app\adminapi\controller\addon;
use app\dict\addon\AddonDict;
use app\service\admin\addon\AddonService;
use app\service\core\addon\CoreAddonService;
use core\base\BaseAdminController;
use think\Response;
/**
* 插件管理
* Class Addon
* @description 插件管理
* @package app\adminapi\controller\addon
*/
class Addon extends BaseAdminController
{
/**
* 插件初始化
* @description 插件初始化
* @return Response
*/
public function init()
{
return success((new CoreAddonService())->getInitList());
}
/**
* 获取已下载插架
* @description 获取已下载插架
*/
public function getLocalAddonList()
{
return success((new CoreAddonService())->getLocalAddonList());
}
/**
* 获取首页应用
* @description 获取首页应用
* @return Response
*/
public function getIndexAddonList()
{
$data = $this->request->params([
['label_id', ''],
]);
return success((new CoreAddonService())->getIndexAddonList($data['label_id']));
}
}前端会员控制器:app/api/controller/member/Member.php
前台会员控制器继承自BaseApiController, 实现了各种前台会员的api接口。
namespace app\api\controller\member;
use app\service\api\login\AuthService;
use app\service\api\member\MemberLogService;
use app\service\api\member\MemberService;
use core\base\BaseApiController;
use think\Response;
class Member extends BaseApiController
{
/**
* 会员信息
* @return Response
*/
public function info()
{
return success(( new MemberService() )->getInfo());
}
/**
* 会员中心
* @return Response
*/
public function center()
{
return success(( new MemberService() )->center());
}
/**
* 修改会员
* @param $field
* @return Response
*/
public function modify($field)
{
$data = $this->request->params([
[ 'value', '' ],
[ 'field', $field ],
]);
$data[ $field ] = $data[ 'value' ];
$data['member_id'] = $this->request->memberId();
$this->validate($data, 'app\validate\member\Member.modify');
( new MemberService() )->modify($field, $data[ 'value' ]);
return success('MODIFY_SUCCESS');
}
/**
* 编辑会员
* @return Response
*/
public function edit()
{
$data = $this->request->params([
[ 'data', [] ],
]);
( new MemberService() )->edit($data[ 'data' ]);
return success('MODIFY_SUCCESS');
}
/**
* 绑定手机号
* @return Response
*/
public function mobile()
{
$data = $this->request->params([
[ 'mobile', '' ],
[ 'mobile_code', '' ],
]);
return success(( new AuthService() )->bindMobile($data[ 'mobile' ], $data[ 'mobile_code' ]));
}
/**
* 会员日志
* @return Response
*/
public function log()
{
$data = $this->request->params([
[ 'route', '' ],
[ 'params', '' ],
[ 'pre_route', '' ]
]);
( new MemberLogService() )->log($data);
return success();
}
/**
* 获取会员码
*/
public function qrcode()
{
return success(( new MemberService() )->getQrcode());
}
/**
* 获取手机号
* @return Response
*/
public function getMobile()
{
$data = $this->request->params([
[ 'mobile_code', '' ],
]);
return success(( new AuthService() )->getMobile($data[ 'mobile_code' ]));
}
}