作用
DaoAdmin中所有控制器的基类。
结构
declare (strict_types = 1); namespace app; use app\common\model\Setting; use Gregwar\Captcha\PhraseBuilder; use support\Response; use support\View; use think\helper\Str; use think\Validate; use Webman\Http\Request; use Gregwar\Captcha\CaptchaBuilder; class BaseController { /** * 应用实例 * @var $app */ protected $app; protected $theme = 'default'; protected $captchaKey = 'captcha'; public function __construct() { Setting::instance()->settings(); } /** * 统一视图 * @param array $assign * @param string $view * @param null $app * @return mixed * @Author fudaoji<fdj@kuryun.cn> */ public function show($assign = [], $view = '', $app = null){ $controller = \request()->getController(); $action = \request()->getAction(); if ($view) { $layer = explode('/', $view); switch(count($layer)){ case 3: $controller = $layer[1]; $action = $layer[2]; $app = $layer[0]; break; case 2: $controller = $layer[0]; $action = $layer[1]; break; default: $action = $layer[0]; break; } } $template = $this->theme. DIRECTORY_SEPARATOR. strtolower($controller) . DIRECTORY_SEPARATOR . strtolower($action); return view($template, $assign, $app); } /** * 验证数据 * @access protected * @param array $data 数据 * @param string|array $validate 验证器名或者验证规则数组 * @param array $message 提示信息 * @param bool $batch 是否批量验证 * @return bool|true */ protected function validate(array $data, $validate, array $message = [], bool $batch = false): bool { if (is_array($validate)) { $v = new Validate(); $v->rule($validate); } else { if (strpos($validate, '.')) { // 支持场景 [$validate, $scene] = explode('.', $validate); } $class = false !== strpos($validate, '\\') ? $validate : $this->parseClass('common\validate', $validate); $v = new $class(); if (!empty($scene)) { $v->scene($scene); } } $v->message($message); // 是否批量验证 if ($batch) { $v->batch(); } return $v->failException()->check($data); } /** * 解析应用类的类名 * @access public * @param string $layer 层名 controller model ... * @param string $name 类名 * @return string */ protected function parseClass(string $layer, string $name): string { $name = str_replace(['/', '.'], '\\', $name); $array = explode('\\', $name); $class = Str::studly(array_pop($array)); $path = $array ? implode('\\', $array) . '\\' : ''; return 'app'. '\\' . $layer . '\\' . $path . $class; } /** * 操作成功跳转的快捷方法 * @access protected * @param mixed $msg 提示信息 * @param string|null $url 跳转的URL地址 * @param mixed $data 返回的数据 * @param int $code * @param integer $wait 跳转等待时间 * @param array $header 发送的Header信息 * @return Response */ protected function success($msg = '', string $url = '', $data = '', int $code = 1, int $wait = 3, array $header = []): Response { if (is_null($url) && \request()->header('referer')) { $url = \request()->header('referer'); } if($msg){ $msg = dao_trans($msg); } $result = [ 'code' => $code, 'msg' => $msg, 'data' => $data, 'url' => (string)$url, 'wait' => $wait, ]; $type = $this->getResponseType(); if ($type == 'html') { return view(config('app.dispatch_success'), $result); } return json($result); } /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息 * @param null $url 跳转的URL地址 * @param mixed $data 返回的数据 * @param int $code * @param integer $wait 跳转等待时间 * @param array $header 发送的Header信息 * @return Response */ protected function error($msg = '', $url = null, $data = '', int $code = 0, int $wait = 3, array $header = []): Response { if (is_null($url)) { $url = request()->isAjax() ? '' : 'javascript:history.back(-1);'; } if($msg){ $msg = dao_trans($msg); } $result = [ 'code' => $code, 'msg' => $msg, 'data' => $data, 'url' => (string)$url, 'wait' => $wait, ]; $type = $this->getResponseType(); if ($type == 'html') { return view(config('app.dispatch_error'), $result); } return json($result); } /** * 获取当前的response 输出类型 * @access protected * @return string */ protected function getResponseType(): string { return request()->isAjax() || request()->acceptJson() ? 'json' : 'html'; } /** * 输出验证码图像 * @param Request $request * @return Response */ public function captcha(Request $request): Response { $phrase = new PhraseBuilder; $code = $phrase->build(4, '0123456789'); $builder = new CaptchaBuilder($code, $phrase); $builder->build(); $builder->setDistortion(false); $request->session()->set($this->captchaKey, strtolower($builder->getPhrase())); $img_content = $builder->get(); return response($img_content, 200, ['Content-Type' => 'image/jpeg']); } /** * 检查验证码 * @param string $text * @return bool */ protected function captchaCheck(string $text): bool { $captcha = $text ?? \request()->post($this->captchaKey); if (strtolower($captcha) !== \request()->session()->get($this->captchaKey)) { return false; } return true; } /** * URL重定向 * @access protected * @param string $url 跳转的URL表达式 * @param integer $code http code * @param array $headers * @return Response */ protected function redirect(string $url, int $code = 302, array $headers = []): Response { return redirect($url, $code, $headers); } /** * @param $name * @param $value * Author: fudaoji<fdj@kuryun.cn> */ protected function assign($name, $value){ View::assign($name, $value); } }