Rumah > rangka kerja php > ThinkPHP > 解析Thinkphp5怎么实现前后端分离

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

藏色散人
Lepaskan: 2021-05-24 09:20:23
ke hadapan
4368 orang telah melayarinya

下面由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'      => [],
];
Salin selepas log masuk

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

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

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

// 默认输出类型
    &#39;default_return_type&#39;    => &#39;json&#39;,
Salin selepas log masuk

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

  return [&#39;code&#39;=>1];
Salin selepas log masuk

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

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

    &#39;exception_handle&#39;       => &#39;app\api\Crossdomain\CdomHandle&#39;,
Salin selepas log masuk

找到对应目录,新增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 = &#39;&#39;;
    private $errline = &#39;&#39;;
    private $errtrace = &#39;&#39;;
    private $errtracestring = &#39;&#39;;
    protected function getSourceCode(Exception $exception)
    {
        // 读取前9行和后9行
        $line  = $exception->getLine();
        $first = ($line - 9 > 0) ? $line - 9 : 1;

        try {
            $contents = file($exception->getFile());
            $source   = [
                &#39;first&#39;  => $first,
                &#39;source&#39; => array_slice($contents, $first - 1, 19),
            ];
        } catch (Exception $e) {
            $source = [&#39;code&#39;=>1];
        }
        return $source;
    }
    public function render(Exception $e)
    {
        $app_debug = Env::get(&#39;APP_DEBUG&#39;);
        //如果是调试模式
        if($app_debug)
        {
            $this->msg = $e->getMessage();
            $this->errCode = $e->getCode();
            $this->errFile = json($this->getSourceCode($e));
            $this->errline = $e->getLine();
            if(Env::get(&#39;APP_TRACE&#39;))
            {
                $this->errtrace = $e->getTrace();
                $this->errtracestring = $e->getTraceAsString();
            }
        }
        else
        {
            $result = [
                &#39;msg&#39; => $e->getMessage(),
                &#39;errFile&#39; => ($this->getSourceCode($e)),

                &#39;code&#39; => 999,
            ];
            return json($result);
        }
        return json([
            &#39;code&#39;=>$this->code,
            &#39;msg&#39;=>$this->msg,
            &#39;errCode&#39;=>$this->errCode,
            &#39;errFile&#39;=>$this->errFile,
            &#39;errLine&#39;=>$this->errline,
            &#39;errtrace&#39;=>$this->errtrace,
            &#39;errtracestring&#39;=>$this->errtracestring
        ]);
    }
}
Salin selepas log masuk

开启强路由

    // 是否开启路由
    &#39;url_route_on&#39;           => true,
    // 路由使用完整匹配
    &#39;route_complete_match&#39;   => true,
    // 是否强制使用路由
    &#39;url_route_must&#39;         => true,
Salin selepas log masuk

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

BaseException说明:https://docs.python.org/3.1/library/exceptions.html#BaseException
Salin selepas log masuk

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

Atas ialah kandungan terperinci 解析Thinkphp5怎么实现前后端分离. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Isu terkini
ThinkPHP Mengapa menggunakan komposer?
daripada 1970-01-01 08:00:00
0
0
0
thinkphp memuat naik fail
daripada 1970-01-01 08:00:00
0
0
0
Bagaimanakah Thinkphp memanggil sambungan PHP?
daripada 1970-01-01 08:00:00
0
0
0
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan