[TOC] #### 1. 定义公共基础控制器 --- **定义应用的公共控制器 `Base.php`** ```php <?php declare(strict_types=1); namespace app\admin\controller; use app\BaseController; /** * admin 应用基础控制器 */ class Base extends BaseController { // 初始化 protected function initialize() { $this->prefix = 'aiaad'; $this->home = '/admin/index'; $this->login = '/admin/login'; } /** * 检测是否登录 * * @return bool true 已登录 false 未登录 */ protected function checkLogin() { return session('?' . $this->prefix); } // +----------------------------------------------------------- // | 登录、退出 // +----------------------------------------------------------- /** * 登录成功 */ protected function sign($data) { session($this->prefix, $data); $this->homePage(); } /** * 退出登录 */ protected function logout() { session($this->prefix, null); $this->loginPage(); } // +----------------------------------------------------------- // | 重定向 // +----------------------------------------------------------- /** * 重定向到登陆页 */ protected function loginPage() { $this->redirect($this->login); } /** * 重定向到后台主页 */ protected function homePage() { $this->redirect($this->home); } /** * 解决基初始化方法中无法重定向问题 * * @param ...$args redirect助手函数参数 */ private function redirect(...$args) { throw new \think\exception\HttpResponseException(redirect(...$args)); } } ``` #### 2. 定义用于校验登录状态控制器 `Auth.php` (未登录重定向到登陆页) --- ```php <?php declare(strict_types=1); namespace app\Admin\controller; /** * 基础控制器处理登陆状态校验 * * 需要校验登陆状态的控制器继承当前控制器即可 */ class Auth extends Base { // 初始化 protected function initialize() { // 调用父类初始化方法 parent::initialize(); // 未登录跳转到登陆页面 $this->checkLogin() || $this->loginPage(); } } ``` #### 3. 登录相关方法, 已登录访问控制器方法重定向到后台主页 ```php <?php declare(strict_types=1); namespace app\admin\controller; /** * 处理登录相关方法 */ class Login extends Base { /** * 初始化方法 * * 已经登录再访问登陆页面重定向到后台主页 */ protected function initialize() { // 调用父类初始化方法 parent::initialize(); // 已经登录访问登录页重定向到后台主页 $this->checkLogin() && $this->homePage(); } /** * 登录接口 */ public function index() { // ... 登录逻辑 // 登录成功后重定向到后台主页 $data = ['id' => mt_rand(1, 999), 'name' => '张三']; $this->sign($data); } } ```