Thinkphp5实现前后端分离
2022-07-28 14:14:58
209
{{single.collect_count}}

用Thinkphp5实现纯API开发实现前后端分离

大致步骤如下

  1. 解决跨域请求问题
  2. 改变输出数据格式为API常用返回JSON格式
  3. 自定义异常处理(修改适配API使用)
  4. 开始强制路由

解决跨域问题
找到 application\targs.php扩展定义文件,修改app_init的值

// 应用行为扩展定义文件return [// 应用初始化'app_init' => ['app\api\Crossdomain\Cdom'],// 应用开始'app_begin'=> [],// 模块初始化'module_init'=> [],// 操作开始执行'action_begin' => [],// 视图内容过滤'view_filter'=> [],// 日志写入'log_write'=> [],// 应用结束'app_end'=> [],];

在application文件夹目录下api\Crossdomain,在目录下新建Cdom.php代码文件,代码如下

<?phpnamespace app\api\Crossdomain;class Cdom{public function appInit($params){//配置IP白名单 在测试环境下可以为 * 号 生产环境下建议根据实际环境进行修改。header('Access-Control-Allow-Origin: *');header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, X_Requested_With,Content-Type, Accept");header('Access-Control-Allow-Methods: POST,GET,PUT');if(request()->isOptions()){exit();}}}

改变输出数据格式为API常用返回JSON格式
TP5默认输出数据格式为HTML,显然不符合常用API接口的数据规范,在此我们需要做相应的修改。找到application目录下的config.php修改如下配置已避免每次都需要手动 json或者json_encode

// 默认输出类型'default_return_type'=> 'json',

修改后返回数据时可直接返回如下

return ['code'=>1];

直接输出json格式的数据
自定义异常处理(修改适配API使用)

TP5原有的异常处理机制如果做api接口的话会造成请求直接崩溃,在异常情况下API接口无法接收到正常的JSON数据而产生错误。为此我们需要自定义TP的异常处理机制。
找到application目录下的config.php配置文件。修改如下选项为

'exception_handle' => 'app\api\Crossdomain\CdomHandle',

找到对应目录,新增CdomHandle.php文件,添加如下代码

<?phpnamespace app\api\Crossdomain;use think\exception\Handle;use think\Env;use Exception;use MyCLabs\Enum\Enum;class CdomHandle extends Handle{private $code = 999;private $msg;private $errCode;private $errFile = '';private $errline = '';private $errtrace = '';private $errtracestring = '';protected function getSourceCode(Exception $exception){// 读取前9行和后9行$line= $exception->getLine();$first = ($line - 9 > 0) ? $line - 9 : 1;try {$contents = file($exception->getFile());$source = ['first'=> $first,'source' => array_slice($contents, $first - 1, 19),];} catch (Exception $e) {$source = ['code'=>1];}return $source;}public function render(Exception $e){$app_debug = Env::get('APP_DEBUG');//如果是调试模式if($app_debug){$this->msg = $e->getMessage();$this->errCode = $e->getCode();$this->errFile = json($this->getSourceCode($e));$this->errline = $e->getLine();if(Env::get('APP_TRACE')){$this->errtrace = $e->getTrace();$this->errtracestring = $e->getTraceAsString();}}else{$result = ['msg' => $e->getMessage(),'errFile' => ($this->getSourceCode($e)),'code' => 999,];return json($result);}return json(['code'=>$this->code,'msg'=>$this->msg,'errCode'=>$this->errCode,'errFile'=>$this->errFile,'errLine'=>$this->errline,'errtrace'=>$this->errtrace,'errtracestring'=>$this->errtracestring]);}}

开启强路由

// 是否开启路由'url_route_on' => true,// 路由使用完整匹配'route_complete_match' => true,// 是否强制使用路由'url_route_must' => true,

这里的Env用法请参考TP手册
BaseException说明

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}