0x001.StartAdmin简介0x002.项目初始化0x003.文件目录说明0x004.设计思维0x005.代码生成0x006.编写业务逻辑0x007.控制器中的变量值和方法说明
0x004.设计思维

一、巧用魔术方法/错误捕获控制器

我们在后台管理模块当中,admin模块中并没有编写太多的控制器,只留下了一个 Error空控制器 加上 __call() 方法捕获访问 /admin 这个URL下的所有请求,进行用户的身份验证完毕之后,渲染对应控制器下指定方法的模板即可,于是有了下面的代码:

<?php

namespace app\admin\controller;

use app\admin\BaseController;
use think\facade\View;

class Error extends BaseController
{
    /**
     * 监听所有请求 渲染对应控制器下方法的页面
     */
    public function __call($method, $args)
    {
        // 判断是否是登录/注册/找回密码
        // 否则进行accesss授权验证 如错误 直接返回
        if (!(strtolower($this->controller) == "user" && in_array(strtolower($this->action), ['login', 'resetPassword', 'reg']))) {
            cookie('access_token', null);
            $error = $this->access();
            if($error){
                return $error;
            }
        }
        if (key_exists('callback', $args)) {
            View::assign('callback', $args['callback']);
        } else {
            View::assign('callback', '/admin');
        }
        return View::fetch();
    }
}
二、面向对象的基类与子类

由于各个模块可能都存在一些相同的操作方法(简单的增删改查),于是我们将通用的一些方法写到Api模块中的 BaseController 中,当实际操作某一个API(如Student学生)信息时,我们只需要继承 BaseController ,因为面向对象继承的特性,这时我们已经有了基类中通用的一些增删改查的方法,这样大大减少了代码中的复用问题。

当然,当某个模块中出现了特殊的需求,我们只需要复制 BaseController 中对应的方法到当前模块的控制器中,然后加入自己需要修改的业务逻辑,即可快速的完成自定义业务逻辑的API接口模块的编写工作。

示例代码:

<?php

namespace app\api\controller;

use think\App;
use app\api\BaseController;
use app\model\Wechat as WechatModel;

class Wechat extends BaseController
{
    public function __construct(App $app)
    {
        parent::__construct($app);
        //查询列表时允许的字段
        $this->selectList = "*";
        //查询详情时允许的字段
        $this->selectDetail = "*";
        //筛选字段
        $this->searchFilter = [
            "wechat_id" => "=",
            "wechat_nick" => "like"
        ];
        $this->model = new WechatModel();
    }
    // 这里我们继承了BaseController 完成了微信粉丝的增删改查
}

更多设计思维手册正在编写中...