您的位置 首页 php

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

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

<?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说明:https://docs.python.org/3.1/library/exceptions.html#BaseException

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

文章来源:智云一二三科技

文章标题:解析Thinkphp5怎么实现前后端分离

文章地址:https://www.zhihuclub.com/25131.shtml

关于作者: 智云科技

热门文章

网站地图