用Thinkphp5实现纯API开发实现前后端分离
解决跨域请求问题
改变输出数据格式为API常用返回JSON格式
自定义异常处理(修改适配API使用)
开始强制路由
找到 application\targs.php扩展定义文件,修改app_init的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 应用行为扩展定义文件 return [ // 应用初始化 'app_init' => [ 'app\api\Crossdomain\Cdom' ], // 应用开始 'app_begin' => [], // 模块初始化 'module_init' => [], // 操作开始执行 'action_begin' => [], // 视图内容过滤 'view_filter' => [], // 日志写入 'log_write' => [], // 应用结束 'app_end' => [], ]; |
在application文件夹目录下api\Crossdomain,在目录下新建Cdom.php代码文件,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php namespace 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 (); } } } |
TP5默认输出数据格式为HTML,显然不符合常用API接口的数据规范,在此我们需要做相应的修改。找到application目录下的config.php修改如下配置已避免每次都需要手动 json或者json_encode
1 2 | // 默认输出类型 'default_return_type' => 'json' , |
修改后返回数据时可直接返回如下
1 | return [ 'code' =>1]; |
自定义异常处理(修改适配API使用)
TP5原有的异常处理机制如果做api接口的话会造成请求直接崩溃,在异常情况下API接口无法接收到正常的JSON数据而产生错误。为此我们需要自定义TP的异常处理机制。
找到application目录下的config.php配置文件。修改如下选项为
1 | 'exception_handle' => 'app\api\Crossdomain\CdomHandle' , |
找到对应目录,新增CdomHandle.php文件,添加如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <?php namespace 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 ]); } } |
开启强路由
1 2 3 4 5 6 | // 是否开启路由 'url_route_on' => true, // 路由使用完整匹配 'route_complete_match' => true, // 是否强制使用路由 'url_route_must' => true, |
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7744/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取