• 技术文章 >php框架 >ThinkPHP

    解析Thinkphp5怎么实现前后端分离

    藏色散人藏色散人2021-05-24 09:20:23转载487
    下面由thinkphp框架教程栏目给大家介绍Thinkphp5实现前后端分离,希望对需要的朋友有所帮助!

    用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代码文件,代码如下

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

    改变输出数据格式为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文件,添加如下代码

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

    开启强路由

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

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

    BaseException说明:https://docs.python.org/3.1/library/exceptions.html#BaseException

    相关推荐:最新的10个thinkphp视频教程

    以上就是解析Thinkphp5怎么实现前后端分离的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:thinkphp 前后端分离
    上一篇:解决ThinkPHP6控制器不存在app\controller\Index的问题 下一篇:介绍thinkphp5.0的后端搭建简单配置
    第16期线上培训班

    相关文章推荐

    • 详解ThinkPHP5实现极验滑动验证码geetest功能• 关于thinkphp5.0.X全版本变量覆盖导致的RCE分析• 介绍thinkphp5.0修改器和数据完成的关系及使用方法• Thinkphp5中怎么定义获取器和修改器• 解决thinkphp5中图片处理中遇到的问题

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网