thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

WBOY
リリース: 2022-04-07 21:05:23
転載
6634 人が閲覧しました

この記事は、thinkPHP に関する関連知識を提供するもので、主にバックエンド API インターフェイスの構築に関連する問題を紹介します。主な内容には、tp6 のダウンロード、エントリ ファイルの非表示、クロスドメインの問題の解決などが含まれます。待ってください、それが皆さんのお役に立てば幸いです。

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

推奨学習: 「PHP ビデオ チュートリアル

1. tp6

をダウンロードします。統合環境phpstudayとは何ですか、composerがインストールされています、tp6はcomposer経由でインストールされています、thinkphp公式Webサイトは直接ダウンロードをサポートしなくなりました。

composer create-project topthink/think tp6
ログイン後にコピー

tp6 の手順に従ってクラウド ドキュメントを読んで tp6 をインストールすることもできます

cmd コマンド ウィンドウからダウンロードした tp6 ディレクトリに入力します。

php think run
ログイン後にコピー

Enter inブラウザ 127.0.0.1:8000 で、次のページにアクセスすると、インストールが成功します。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

2. エラー デバッグをオンにする

開始する前に、まずエラーをオンにします。 tp6 のデバッグ
1. config/app.php で show_error_msg を見つけて true
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
に変更します。 2. 以下のルート ディレクトリで .example.env ファイルを見つけ、このファイルの名前を変更して削除します.example
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
ここのコードを見ると、app_debug
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
がオンになっていることがわかり、完全なエラー メッセージが表示されます。次に例を示します。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

3. 隠しエントリ ファイル

セクション 1 では、

http://127.0.0.1:8000

にアクセスします。

実際のアクセスは

http://127.0.0.1:8000/index.php/index/index

これを使用することもできますメソッド

http://127.0.0.1:8000/index/index

にアクセスします。何も入力しない場合は、デフォルトで設定内のインデックス コントローラーにアクセスします。 /app .php ファイルにそのような定義があります デフォルトのコントローラを変更することもできます
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
また、どのコントローラにアクセスしても、fill-in メソッドがなければアクセスしますコントローラーのインデックス メソッド。インデックス メソッドが存在しない場合は、メソッドが存在しないというエラー メッセージが表示されます。
プロジェクトのルート ディレクトリで実行されている php think run によって開始された Web サービスを通じて、tp6 はエントリ ファイルを非表示にするのに役立ちます。これにより、3 番目の方法でアクセスできるようになります。ただし、このセクションで説明するのは、入り口を隠すことです。tp6 に付属する Web サービスを使用するにはどうすればよいですか。だから自分でやってください。
開発時には、WNMP などの一連の Web ソリューションをローカルで構築することがよくありますが、そのためにはエントリ ファイルindex.php を自分で非表示にする必要があります

なぜ非表示にする必要があるのですか?エントリーファイル?

  1. #http://127.0.0.1:4321/index.php/index/index アクセス方法のため、このindex.php は非常に見苦しいです。
  2. 余計です。
  3. 危険
ここでは統合環境を使用しているため、Apacheサーバーを選択したため、次の隠しエントリファイルを探すだけでした。 apache.メソッド、nginxは自分で探す必要があります。

ここで、Apache サーバーを有効にし、開かれたポートは 4321 です。

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

渡したいときは、

http://127.0.0.1:4321 /index /index

メソッドにアクセスするとアクセスが失敗します


thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例 しかし、アクセスするエントリファイルを追加するとアクセスが成功します

http:///127.0.0.1:4321/index.php/index/index

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例index.php を非表示にするのは非常に簡単です。 public ディレクトリで .htaccess ファイルを見つけて、次のコードを追加します。

 #如果mode_rewrite.c模块存在 则执行以下命令
  Options +FollowSymlinks -Multiviews
  RewriteEngine On #开启 rewriteEngine
  # !-d 不是目录或目录不存在
  RewriteCond %{REQUEST_FILENAME} !-d 
  # !-f 不是文件或文件不存在
  RewriteCond %{REQUEST_FILENAME} !-f 

  RewriteRule ^(.*)$ index.php [QSA,PT,L]
  # 参数解释
  # ^(.*)$: 匹配所有的路口映射
  # QSA: (Query String Appending)表示保留参数入get传值?xxx==xx;
  # PT: 把这个URL交给Apache处理;
  # L: 作为最后一条,遇到这条将不再匹配这条之后的规则
ログイン後にコピー
今すぐアクセス

http://127.0.0.1:4321/index/index

アクセス成功


# #

需要注意,在第一节中我们看到,运行了php think run 后,我们的项目目录访问的是public目录
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
官方文档中也说在项目中应该只有public目录是可以被外界访问的,所以如果有什么需要访问的图片、视频等资源,应该放在此目录下

4、解决跨域问题

在应用开发中,前后端都是分开独立开发的,而前后端通常都会自己搭建一个web服务,运行在不同的端口上,在前端访问后端的接口时,会报跨域的错误。而这种跨域问题通常是要有后端来处理的,tp6有专门的中间件来做这个事情,真是太方便了,只需要在app目录下的middleware.php中添加该中间件,就实现了跨域访问。

ログイン後にコピー

5、路由解决api版本控制

在app目录中的container控制器中新建两个文件夹v1,v2,在其中都创建User.php文件
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
v1/User.php

ログイン後にコピー

v2/User.php

ログイン後にコピー

注意上面两个文件的命名空间,就第一行代码,在哪个文件夹下,就写到哪里。
现在方法有了,我们还无法访问,需要使用路由,让路由帮我们找对应的方法。

至于路由的概念去文档自己看。我这里主要用路由组的方式,我觉得这个比资源路由好用,灵活。

在根目录下的route目录下的app.php文件代码如下:

// +----------------------------------------------------------------------use think\facade\Route;// api版本控制$v = request()->header('Api-Version');// 默认api版本为v1if ($v == null) $v = "v1";// 用户Route::group('user', function () {
  Route::post('login', 'login');})->prefix($v.'.user/')->pattern(['id' => '\d+']);
ログイン後にコピー

以上代码进行控制api版本的方式是,请求发起者在header中传递要访问的api的版本,这里获取到对应的版本,访问对应的方法。

鉴于以上我使用的是post请求,且要传递header,所以使用postman进行测试。
访问v1版本的接口时:
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
访问v12版本的接口时:
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

6、jwt token验证

我用的是tp6看云文档收录的插件

composer require thans/tp-jwt-auth
ログイン後にコピー

该插件的github地址-文档
在开始之前可以看看文档里是怎么操作的,我也是按照文档来的

安装完成后,该插件所在的位置在根目录下的vendor/thans/tp-jwt-auth
还会在根目录下的config目录下生成jwt.php文件来记录一些配置信息
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
看这里都是读取的env中的参数,所以咱也在根目录下的.env文件中配置参数。
在根目录下打开cmd窗口,执行

php think jwt:create
ログイン後にコピー

会帮你在.env文件中生成密钥secret,红色框中的是新增的内容
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
token的有效期为60秒,为了方便我们测试,我就不改了,如果你要改,可以在.env中添加,这样就改成了1小时
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
这个插件有三种方式【header,token,param】传递token,我就使用其中一个,也是最常用的一种,就是在【header】中传递token信息,这个插件默认验证header中的token信息需要传递的参数名为authorization,而在header中直接传递该参数tp6是获取不到的,需要做一些设置,
在根目录中的public目录下的.htacccess文件中添加

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
那么现在开始测试:

(1).生成token

我就在之前创建的v1/User.php控制器中写了

 1,'name'=>'ceshi']);
      return $token;
    }}
ログイン後にコピー

在postman中测试
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

(2).验证token

我使用的是路由中间件的方式验证token,

写一个中间件

在根目录下的app目录中创建middleware目录,在其下创建CheckToken.php文件
app/middleware/CheckToken.php
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
文件内容

isOptions()) {
            return response();
        }
    	try {
            JWTAuth::auth();
        }catch (JWTException $e) {
        	return json($e->getMessage());
        }
        return $next($request);
    }}
ログイン後にコピー
 起别名

给该中间件起个别名,在根目录下的config/middleware.php文件中
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

在路由文件中使用中间件

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

创建对应的方法

在第三步中我们创建了一个getUserInfo()方法,现在在User.php文件中创建

public function getUserInfo() {
   return json(['id'=>1, 'name'=> '啦啦啦']);}
ログイン後にコピー

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

验证一下

刚刚创建的token必然过期了,咱重新获取一条
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

现在验证一下,请求userinfo方法,并在header中添加参数Authorization,
注意:token值需要加上bearer ,bearer后的空格也要的。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
过了一分钟后,我们再来试一试
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
可以看到token验证提示,该通过过期了,这个插件成功了,并没有继续往下走,把之前的信息返回。

(3).注销token

这个插件在github中的文档中没有说到怎么注销或删除token,只有一个刷新refresh和拉黑invalidate,我看了一下它的代码,刷新方法中会调用拉黑方法,看到这个注释,让我激动了一下,鸡儿!原来拉黑就是注销
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
这个拉黑的具体操作就是把你要注销的token保存在本地的cookie中,默认的保存时间是14天,14天后cookie会自己删除的,你可以在根目录下的runtime目录下的cache目录中找到对应的文件,我就不测试这个方法了,我感觉这个操作好像没什么必要。

文件内容形似这样
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
至此token这节就结束了。

什么?
你想改默认的token名称?那你可得好好研究这个插件了,看看怎么改,改完了记得踢我一脚,让我也看看,虽然我觉得一个Authorization已经够用了。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

7、统一的参数返回形式

实际开发中,后端返回给前端的参数往往都是这样的。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
所以我们需要对参数返回形式做个统一的处理
在app目录下的common.php中定义的方法全局都可调用,所以在这个文件中定义此方法。

 $code,
      "msg" => $msg,
      "data" => $data
  ];
  // 调用Response的create方法,指定code可以改变请求的返回状态码
  return Response::create($result, $type)->code($code);}
ログイン後にコピー

唉,这个时候,经验的重要性就体现出来,我是个前端,而且在我自己看来,还算是个没有工作经验的前端,

  1. 不知道他们后端到底怎么处理这个状态码,网上的东西越看越乱,状态码可以分为业务状态码和请求返回的状态码,我这里就简单了,就只有请求返回的状态码,虽然在返回的数据中也传递了这个码,其实没什么用,小项目、不复杂的项目根本用不少业务状态码。
  2. 我看别人还会单独分装成功和失败的方法,这个就看自己习惯了,我感觉好像没啥必要。
  3. 终究是经验不足,网上能参考的代码太少,还千篇一律,最可气的是一篇文章居然可以在多个博客网站上出现,别人抄的、复制的就算了,作者自己也发这么多地方,真的搞笑,百度一下,跳出来全是同一个,标题也是一样,很迷~。

调用就很简单了,可以直接使用
我们还是改一下login方法

public function login(){
   $data = [
     ['id'=>1,'name'=>'杰森'],
     ['id'=>2,'name'=>'麦克']
   ];
   $code = 200;
   $msg = '获取成功';
   return result($data, $msg, $code);
 }
ログイン後にコピー

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
返回结果
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
这样好像没有体现我们修改的请求的状态码,那我们把$code改成500,再来看看结果如何
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
咱已经成功的将改请求状态变成了500
得嘞,现在再来回头看看我们之前写的检查jwt的中间件,把返回的结果封装一下
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
再去验证一下看看,看着返回的结果就舒服多了,这特么才是后端给前端返回的结果。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
本小节结束,记录一下一些常见的状态码,我在自己写的时候就只用到了这些状态码

状态码 描述
200 请求成功
204 请求成功,未返回实体,比如option请求,这玩意儿用不着呀
400 错误的请求
401 认证失败,这个一般在token验证那里
403 拒绝访问
404 请求的资源不存在
422 参数验证错误
500 服务器错误

7、异常捕捉

异常捕捉(看云文档)内容挺多的,自己去百度吧,我就把我遇到过的常见的错误进行捕捉,其它的异常我也爱莫能助,不懂啊 !>_>!
我也就不自定义类了,直接在它给的默认的异常处理文件里写了。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

(1)参数验证错误捕捉

我们先写一个参数验证的类,在app目录下创建validate目录,创建User.php文件
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
app/validate/User.php

 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];
    
    protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',    
    ];
    }
ログイン後にコピー

tp6的异常捕捉分为两种,自动和手动的,手动的就是通过try{}catch{}捕捉。tp6的异常捕捉大多是自动的,不过,比如我们现在要操作的参数验证错误就需要自己去捕捉来抛出异常,我们此节的目的是统一捕捉这个错误,我就不用手动的了。
我们就在异常处理类的render方法中添加这个捕捉抛出就可以了。
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

// 1.参数验证错误
 if ($e instanceof ValidateException) {
     return result($e->getError(), '参数验证不通过', 422);
 }
ログイン後にコピー

现在在方法中一下,看看能否捕获。
app/controller/v1/User.php
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
查看结果,成功被捕获到了,并抛出了错误内容
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
如果验证通过了,就会正常的走下去,则会显示我return的测试内容
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

(2)未匹配到资源或方法的异常捕获

我还没找到方法,在我的预想中这个应该要做到能够准确的反应未匹配到的原因。

// 2.方法(控制器、路由、http请求)、资源(多媒体文件,如视频、文件)未匹配到,// 一旦在定义的路由规则中匹配不到,它就会直接去匹配控制器,但是因为在控制器中做了版本控制v1,v2这样的,所以它是无法获取对应控制器的// 所以都会直接走了HttpException的错误// 感觉好像也无所谓,反正是做api接口的,只不过这样就不好准确的提示信息了// 到底这个请求时控制器找不到呢?还是方法找不到?还是请求类型(get,post)不对?if(($e instanceof ClassNotFoundException || $e instanceof RouteNotFoundException) || ($e instanceof HttpException && $e->getStatusCode()==404)){
  $data = [
    'err_msg' => $e -> getMessage(),
    'tips_1' => '请检查路径是否是否填写正确',
    'tips_2' => '请检查请求类型是否正确',
  ];
  return result($data, '方法或资源未找到,请检查', 404);}
ログイン後にコピー

下面就不写了,太麻烦了,直接放全部代码

isAjax()) {
            return response($e->getMessage(), $e->getStatusCode());
        }
        // 使用了错误的数据类型 或 缺失参数
        if ($e instanceof InvalidArgumentException || $e instanceof ErrorException) {
          $fileUrlArr = explode(DIRECTORY_SEPARATOR, $e->getFile());
          $data = [
            'err_msg' => $e->getMessage(),
            'file' => $fileUrlArr[count($fileUrlArr) - 1],
            'line' => $e->getLine()
          ];
          return result($data, '参数错误', 413);
        }
        // 1.参数验证错误
        if ($e instanceof ValidateException) {
            return result($e->getError(), '参数验证不通过', 422);
        }
        // 2.方法(控制器、路由、http请求)、资源(多媒体文件,如视频、文件)未匹配到,
        // 一旦在定义的路由规则中匹配不到,它就会直接去匹配控制器,但是因为在控制器中做了版本控制v1,v2这样的,所以它是无法获取对应控制器的
        // 所以都会直接走了HttpException的错误
        // 感觉好像也无所谓,反正是做api接口的,只不过这样就不好准确的提示信息了
        // 到底这个请求时控制器找不到呢?还是方法找不到?还是请求类型(get,post)不对?
        if(($e instanceof ClassNotFoundException || $e instanceof RouteNotFoundException) || ($e instanceof HttpException && $e->getStatusCode()==404)){
          $data = [
            'err_msg' => $e -> getMessage(),
            'tip_1' => '请检查路径是否是否填写正确',
            'tips_2' => '请检查请求类型是否正确',
          ];
          return result($data, '方法或资源未找到,请检查', 404);
        }
        // 3.语法错误
        if ($e instanceof ParseError) {
          $fileUrlArr = explode(DIRECTORY_SEPARATOR, $e->getFile());
          $data = [
            'err_msg' => $e->getMessage(),
            'file' => $fileUrlArr[count($fileUrlArr) - 1],
            'line' => $e->getLine()
          ];
          return result($data, '服务器异常-语法错误', 411);
        }
        // 4.数据库错误
        if ($e instanceof PDOException || $e instanceof DbException) {
          $fileUrlArr = explode(DIRECTORY_SEPARATOR, $e->getFile());
          $data = [
            'err_msg' => $e->getMessage(),
            'file' => $fileUrlArr[count($fileUrlArr) - 1],
            'line' => $e->getLine()
          ];
          return result($data, '服务器异常-数据库错误', 412);
        }
        // 其他错误交给系统处理
        return parent::render($request, $e);
    }}
ログイン後にコピー

本节结束,这里面用的错误处理都是我在平常练习中遇到的错误,至于其他的没有处理是因为我还没碰到,碰到再说吧。为了给前端好的反馈,我们应该处理所有的异常的返回形式,不然,tp6默认返回页面形式的,前端等于得不到相应了。至于这个自定义异常捕获,应该有相应的插件的吧,你要是感兴趣可以去找找。

7、自动生成api文档

之前我还很好奇,后端是怎么搞出接口文档的,都是自己录入数据套模板的吗?原来他么的都是插件做的,真他么方便!!!

(1)安装插件

composer require hg/apidoc// 文档// https://hgthecode.github.io/thinkphp-apidoc/guide/install/
ログイン後にコピー

你就照着插件的文档来就好了,不用跟着我。

(2)下载对应的前端页面

下载最新的,放在public目录下
thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例

(3)使用

具体配置你还得看文档,我就直接照着最简单的做了,
我就试一个,将app/controller/v1/User.php写了注释,它会读注释生成接口文档

 引入注释

app/controller/v1/User.php

ログイン後にコピー
查看效果

thinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例
这个接口文档这里有点小问题,因为我们前面使用在header中添加api版本的方式控制请求的api版本,所以如果直接用/user/login是无法访问到控制器的,也就访问不到方法,必须得加上控制器所在位置的信息,就在前面加上了v1,变成了v1.user/login。这种形式是通过控制器去访问的方法,显然不理想,我想要达到的目标是不需要再里面加上v1,这个还得好好研究研究,不然前面定义的路由不是跟这个接口文档对不上了吗?你们要是研究到了,记得踢我一脚哈 >_>!

#后记:当时只是练习一下我,我也没深究,but其实这个apidoc它的官方文档里有设置项的,关于这个多应用/多版本的配置项,去apidoc的文档去看吧,在config/apidoc.php修改apps的配置就可以了,然后就可以通过右上角的选择框切换版本了

    // 设置应用/版本(必须设置)
    'apps'           => [
        [
            'title'=>'演示示例',
            'path'=>'app',
            'folder'=>'controller',
            'items'=>[
                ['title'=>'V1.0','path'=>'app\controller\v1','folder'=>'v1'],
                ['title'=>'V2.0','path'=>'app\controller\v2','folder'=>'v2']
            ]
        ],
    ],
ログイン後にコピー

推荐学习:《PHP视频教程

以上がthinkphp6 がバックエンド API インターフェイスを構築する方法の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!