>  기사  >  PHP 프레임워크  >  Thinkphp5가 프런트엔드와 백엔드 분리를 어떻게 구현하는지 분석

Thinkphp5가 프런트엔드와 백엔드 분리를 어떻게 구현하는지 분석

藏色散人
藏色散人앞으로
2021-05-20 15:31:144214검색

다음 thinkphp 프레임워크 튜토리얼 칼럼에서는 Thinkphp5의 프론트엔드와 백엔드 분리에 대해 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!

Thinkphp5를 사용하여 순수 API 개발 구현 및 프론트엔드와 백엔드 분리 실현

일반적인 단계는 다음과 같습니다

1. 크로스 도메인 요청 문제 해결
2. 형식을 일반적으로 사용되는 API 반환 JSON 형식
3. 예외 처리(적응 API 사용 수정)
4. 강제 라우팅 시작

교차 도메인 문제 해결
applicationtargs.php 확장 정의 파일을 찾아 수정합니다. app_init 값

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

응용 프로그램 폴더 디렉토리에서 Cdom.php 코드 파일 디렉토리에 apiCrossdomain을 생성하면 코드는 다음과 같습니다

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

출력 데이터 형식을 일반적으로 사용되는 API 반환 JSON 형식으로 변경합니다
기본 출력 TP5의 데이터 형식은 일반적으로 사용되는 API 인터페이스의 데이터 사양을 분명히 준수하지 않는 HTML입니다. 애플리케이션 디렉터리에서 config.php를 찾아 다음 구성을 수정하면 매번 수동으로 json 또는 json_encode를 수행할 필요가 없습니다

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

수정 후 데이터를 반환할 때 다음과 같이 직접 반환할 수 있습니다

  return [&#39;code&#39;=>1];

json 형식으로 데이터를 직접 출력
사용자 정의 예외 처리(API 사용에 맞게 수정)

TP5의 원래 예외 처리 메커니즘은 API 인터페이스로 사용되는 경우 요청이 직접 중단되는 원인이 됩니다. 비정상적인 상황에서 API 인터페이스는 일반 JSON 데이터를 수신하고 생성할 수 없습니다. 오류. 이를 위해 TP의 예외 처리 메커니즘을 사용자 정의해야 합니다.
애플리케이션 디렉토리에서 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 = &#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
        ]);
    }
}

Enable Strong Routing

    // 是否开启路由
    '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.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제