Skip to content

接口流程

liaofei edited this page Jan 20, 2021 · 1 revision

主要讲解controller目录,每个controller有自己独立的路由,配置,事件,容器,控制器中可用框架核心及扩展。每个控制器其实就是一个独立的控制类。

请求流程大致分为以下流程,依次从左到右

请求流程

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\adminapi\controller\v1\user;

use app\services\user\UserServices;
use think\exception\ValidateException;
use think\facade\App;
use think\Request;


class User extends AuthController
{
    /**
     * user constructor.
     * @param App $app
     * @param UserServices $services
     */
    public function __construct(App $app, UserServices $services)
    {
        parent::__construct($app);
        $this->services = $services;
    }


    /**
     * 获取用户信息
     *
     * @return \think\Response
     */
    public function index()
    {
        $where = $this->request->getMore([
            ['uid', 0],
        ]);
        return $this->success($this->services->index($where['uid']));
    }

   }

Services

所有的业务都在services层中处理,service层调用dao层,【注意:每个独立的services层只能调用对应的dao层,不能调用其他模型dao层。
比如:services/user/UserServices.php中只能调用dao/user/UserDao.php,无法调用 dao/order/StoreOrderDao.php。要想调用其他模型数据,
只能在UserServices.php中调用services/order/StoreOrderServices.php的方法来实现其他模型数据调用】。 例如:

<?php

namespace app\services\user;

use app\dao\user\UserDao;
use think\Model;

class UserServices extends BaseServices
{

    /**
     * UserServices constructor.
     * @param UserDao $dao
     */
    public function __construct(UserDao $dao)
    {
        $this->dao = $dao;
    }

    /**
     * 获取用户信息
     * @param $id
     */
    public function index(int $uid)
    {
        return $this->dao->getOne($uid);
    }
}

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);
    }

   
}
Clone this wiki locally