最近在使用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' => []]);
}
}
}