网站首页 » Thinkphp » 使用thinkphp5 版本写接口创建基类及数据返回问题

使用thinkphp5 版本写接口创建基类及数据返回问题

June 19, 2020 Thinkphp

最近在使用thinkphp5.0 版本做一个后端接口, 在做的过程中发现助手函数 json 在接口基类中 返回接口信息失败。 在此记录一下

话不多说,上代码。

基类控制器

<?php
/**
 *
 * File BaseController
 * author kevink
 * @return
 */
 
namespace app\api\controller;
use think\Controller;
 
class BaseController extends Controller
{
    //用户ID
    public $user_id = 0 ;
    public $key = 'cx';
 
 
    public function __construct()
    {
        parent::__construct();
 
        if(!$this->request->isPost()){
            $data = ['code' => -1000, 'msg' => '请求方式错误', 'data' => []];
            //本想使用助手函数json 来达到抛出错误信息的方式,但是发现return 后,接口并没有抛出错误,而是继续往下执行,所以改用以下方法。
            //return json($data);
            $response = \think\Response::create($data, 'json');
            throw new \think\exception\HttpResponseException($response);
        }
 
        $this->init($this->request);
    }
 
    //初始化数据
    public function init($request){
        $token = $request->post('token', '', 'htmlspecialchars');
        $user_id = $request->post('user_id', 0, 'intval');
        $timestamp = $request->post('timestamp', '', 'htmlspecialchars');
        if($token != '' && $user_id != 0 && $timestamp != ''){
            //如果携带者token  则验证token
 
            //token生成方式
            // md5(cx + timestamp + user_id + cx)
            $newMd5 = md5($this->key . $timestamp . $user_id . $this->key);
            if($newMd5 == $token){
                //验证成功
                //验证登陆是否过期
                if($timestamp > time()){
                    $this->user_id = $user_id;
                }
            }
        }
    }
 
    /**
     * 生成用户token
     * Function generateToken
     * author kevink
     * @param $user_id
     * @return string
     */
    public function generateToken($user_id =0 ){
        if($user_id ==0 ) return false;
        $expireTime = time() + 3* 86400;
        $token = md5($this->key . $expireTime . $user_id . $this->key);
        return ['token' => $token, 'timestamp' => $expireTime , 'user_id' => $user_id];
    }
 
}

需要登陆的用户基类

<?php
/**
 *
 * File MemberBaseController
 * author kevin
 * @return
 */
 
namespace app\api\controller;
 
class MemberBaseController extends BaseController
{
    public function __construct()
    {
        parent::__construct();
        if($this->user_id == 0){
            $data = ['code' => -10002, 'msg' => '请先登陆', 'data' => []];
            $response = \think\Response::create($data, 'json');
            throw new \think\exception\HttpResponseException($response);
        }
    }
 
}

可以看到BaseController 继承了 thinkController , MemberBaseController 继承自BaseController .。 在 BaseController 和 MemberBaseController 中如果想要使用 return json($data);

并不能达到接口抛出结果的效果。 所以改使用以下办法

$response = \think\Response::create($data, 'json');
throw new \think\exception\HttpResponseException($response);

在接口控制器中, 使用助手函数,能达到抛出结果。

<?php
/**
 *
 * File PubController
 * author kevink
 * @return
 */
 
namespace app\api\controller;
use app\common\model\MemberModel;
 
class PubController extends BaseController
{
    public function login(){
 
        $loginName = $this->request->post('login_name', '','htmlspecialchars');
        $password = $this->request->post('password', "", "htmlspecialchars");
 
        $model = new MemberModel();
        $ret = $model->login([
            'login_name' => $loginName,
            'password' => $password,
            'request' => json_encode($this->request->header()),
        ]);
 
        if($ret['code'] == -1) return json($ret);
        //生成token
        $data = $this->generateToken($ret['data']['user_id']);
        if($data){
            return json(['code' => 1, 'msg' => '登陆成功', 'data' => $data]);
        }else {
            return json(['code' => -1, 'msg' => '生成TOKEN失败', 'data' => []]);
        }
 
    }
}

添加新评论