编程学习网 > PHP技术 > ThinkPHP框架 > ThinkPHP5如何实现前后端分离?看完就知道了
2021
04-28

ThinkPHP5如何实现前后端分离?看完就知道了


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


大致步骤如下:
解决跨域请求问题
改变输出数据格式为API常用返回JSON格式
自定义异常处理(修改适配API使用)

开始强制路由


解决跨域问题

找到 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,
看完是不是就明白了ThinkPHP如何实现前后端分离,更多相关内容咨询欢迎前往编程学习网了解。


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取