3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

YUMEMI Advent CalendarAdvent Calendar 2021

Day 7

Laravel のルーティングファイルを web や api 以外に増やす

Last updated at Posted at 2021-12-07

この記事は、ゆめみ Advent Calendar 2021 の7日目の記事です(もう過ぎちゃったけど)

Laravel でデフォルトで用意しているルーティング定義ファイルとして api.phpweb.php があります
ユーザー定義のルーティング定義ファイルを増やす方法を紹介します

前提条件

確認したバージョン

  • PHP 8
  • Laravel v8.x

やり方

参考に実装してみた Pull Request の Files changed を見るのが手っ取り早いです

参考実装に従って、ヘルスチェック用のルーティングファイルを増やす手順を示します

ヘルスチェック用のルーティングを書くファイルを新しく作る

routes/health-check.php とでもします

routes/health-check.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/health-check', function () {
    return response()->json(['status' => 'ok']);
});

クロージャで適当な JSON を返しておきます

RouteServiceProvider でルーティングを登録

boot メソッドに足しましょう

app/Prooviders/RouteServiceProvider.php
public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));

+       Route::namespace($this->namespace)
+           ->group(base_path('routes/health-check.php'));
    });
}

これだけで OK です
ヘルスチェックのエンドポイントを叩けばレスポンスが返ってきます

$ curl -i http://localhost/health-check
HTTP/1.1 200 OK
Date: Tue, 07 Dec 2021 15:41:59 GMT
Server: Apache
Cache-Control: no-cache, private
X-Robots-Tag: noindex, nofollow
Content-Length: 15
Content-Type: application/json

{"status":"ok"}

メリット

  • ヘルスチェックのためだけのルーティングが、アプリケーションのルーティングに混ざらなくて良い
  • webapi のルーティンググループで通している Middleware を通らないので、無駄な処理が発生しない
    • 例えば、セッションが生成されたりしない 1
  • その気になればちょっとした処理も書ける
    • バックエンドのデータストアとの接続性を確認したり
    • データストアからメンテナンス状態を確認して、メンテナンスモードのレスポンスを返すなど
  • がんばればテストも書ける
  • PHP や Laravel のブートストラップまでは正常に動くことが確認できる

デメリット

  • 単に Web サーバーが生きているか確認するだけなら、 public に静的ファイルを置くだけでよい
  • web や api で動かしている Middleware が生きてるかは確認できない
    • RouteServiceProvider での登録時にヘルスチェックで確認したいものを Middleware group 指定すればいいけど
  • フレームワークのバージョンが上がって、 RouteServiceProvider の書き方が変わったら移植する必要がある
    • 6.x → 8.x で結構変わってた
  • ルーティングの重複に気づきづらい
    • API に行って欲しいけど一生ヘルスチェックに吸われるとかがあるかも

まとめ

  • 気軽にルーティングファイルを生やしていきましょう
    • アプリケーション内のある程度の単位で別けるのも、スッキリして良さそう
  • ただし、やりすぎると混乱するのでほどほどに
  1. AWS ELB のヘルスチェックで無限にセッションが生成される地獄を経験された方なら嬉しさがわかるかも

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?