Maison  >  Article  >  cadre php  >  Analysez comment Thinkphp5 réalise la séparation front-end et back-end

Analysez comment Thinkphp5 réalise la séparation front-end et back-end

藏色散人
藏色散人avant
2021-05-20 15:31:144214parcourir

Ce qui suit est une introduction à la séparation front-end et back-end de Thinkphp5 de la colonne du didacticiel du framework thinkphp. J'espère que cela sera utile aux amis dans le besoin !

Utilisez Thinkphp5 pour réaliser un développement d'API pur et réaliser une séparation front-end et back-end

Les étapes générales sont les suivantes

1. Problème de demande de domaine
2. Changez le format des données de sortie au format JSON de retour d'API couramment utilisé
3. Personnalisez la gestion des exceptions (modifiez l'utilisation de l'API d'adaptation)
4. routage forcé

Résoudre les problèmes inter-domaines
Recherchez le fichier de définition de l'extension applicationtargs.php et modifiez la valeur de app_init

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

Dans apiCrossdomain dans le répertoire du dossier de l'application , créez un nouveau fichier de code Cdom.php dans le répertoire. Le code est le suivant

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

Changez le format des données de sortie au format JSON de retour d'API commun
Les données de sortie par défaut Le format de TP5 est HTML, ce qui n'est évidemment pas conforme aux spécifications de données des interfaces API courantes. Ici, nous devons apporter les modifications correspondantes. Recherchez config.php dans le répertoire de l'application et modifiez la configuration suivante pour éviter d'avoir besoin de json ou json_encode manuellement à chaque fois

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

Après modification, lors du renvoi des données, vous pouvez directement renvoyer le

  return [&#39;code&#39;=>1];
pour sortir directement les données au format json


Gestion personnalisée des exceptions (modifier l'utilisation d'une API adaptée)

Le mécanisme de gestion des exceptions d'origine de TP5 fera planter directement la requête si elle est utilisée en tant qu'interface API. Dans une situation anormale, l'interface API n'a pas pu recevoir les données JSON normales et une erreur s'est produite. Pour cela, nous devons personnaliser le mécanisme de gestion des exceptions de TP.

Recherchez le fichier de configuration config.php dans le répertoire de l'application. Modifiez les options suivantes en

    'exception_handle'       => 'app\api\Crossdomain\CdomHandle',
pour trouver le répertoire correspondant, ajoutez le fichier CdomHandle.php, ajoutez le code suivant

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

activer le routage fort

    // 是否开启路由
    'url_route_on'           => true,
    // 路由使用完整匹配
    'route_complete_match'   => true,
    // 是否强制使用路由
    'url_route_must'         => true,
Veuillez vous référer au manuel TP pour l'utilisation d'Env ici


BaseException说明:https://docs.python.org/3.1/library/exceptions.html#BaseException

Recommandations associées :

Les 10 derniers didacticiels vidéo thinkphp

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer