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

下面由thinkphp框架教程栏目给大家介绍thinkphp5实现前后端分离,希望对需要的朋友有所帮助!

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

大致步骤如下

1.解决跨域请求问题
2.改变输出数据格式为API常用返回JSON格式
3.自定义异常处理(修改适配API使用)
4.开始强制路由

解决跨域问题
找到 applicationtargs.php扩展定义文件,修改app_init的值

立即学习PHP免费学习笔记(深入)”;

// 应用行为扩展定义文件 return [     // 应用初始化     'app_init'     => [         'appapiCrossdomainCdom'     ],     // 应用开始     'app_begin'    => [],     // 模块初始化     'module_init'  => [],     // 操作开始执行     'action_begin' => [],     // 视图内容过滤     'view_filter'  => [],     // 日志写入     'log_write'    => [],     // 应用结束     'app_end'      => [], ];

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

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

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

// 默认输出类型     'default_return_type'    =&gt; 'json',

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

  return ['code'=&gt;1];

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

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

    'exception_handle'       => 'appapiCrossdomainCdomHandle',

找到对应目录,新增CdomHandle.php文件,添加如下代码

<?php namespace appapiCrossdomain;  use thinkexceptionHandle; use thinkEnv; use Exception; use MyCLabsEnumEnum;  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 &gt; 0) ? $line - 9 : 1;          try {             $contents = file($exception-&gt;getFile());             $source   = [                 'first'  =&gt; $first,                 'source' =&gt; array_slice($contents, $first - 1, 19),             ];         } catch (Exception $e) {             $source = ['code'=&gt;1];         }         return $source;     }     public function render(Exception $e)     {         $app_debug = Env::get('APP_DEBUG');         //如果是调试模式         if($app_debug)         {             $this-&gt;msg = $e-&gt;getMessage();             $this-&gt;errCode = $e-&gt;getCode();             $this-&gt;errFile = json($this-&gt;getSourceCode($e));             $this-&gt;errline = $e-&gt;getLine();             if(Env::get('APP_TRACE'))             {                 $this-&gt;errtrace = $e-&gt;getTrace();                 $this-&gt;errtracestring = $e-&gt;getTraceAsString();             }         }         else         {             $result = [                 'msg' =&gt; $e-&gt;getMessage(),                 'errFile' =&gt; ($this-&gt;getSourceCode($e)),                  'code' =&gt; 999,             ];             return json($result);         }         return json([             'code'=&gt;$this-&gt;code,             'msg'=&gt;$this-&gt;msg,             'errCode'=&gt;$this-&gt;errCode,             'errFile'=&gt;$this-&gt;errFile,             'errLine'=&gt;$this-&gt;errline,             'errtrace'=&gt;$this-&gt;errtrace,             'errtracestring'=&gt;$this-&gt;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视频教程

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享