実現したいこと
フロントはVue3で書いておりLaravelは基本APIとしての呼び出しで使用しています。
テスト用データを作成するに当たりテーブルの関連が多いためシステム自体の日付を戻して正規の画面で入力するという話になりました。
調べてみてCarbonでsetTestNowを利用すると時間を固定できる事がわかり、同じインスタンス上ならCarbonの時刻が連動するようだという認識を持ちました。
ただコントローラが多いので全てのコントローラーにコードを書くのは現実的でないと思ったのでコントローラー前に実行しておきたいと考えたのが今回の主題です。
発生している問題・分からないこと
Middleware等のコントローラー以前の段階で実行しておこうと思ったのですがMiddlewareを作成して入れてみるとリクエスト全てにsetTestNowが走るからかわかりませんが429エラーが出てしまいなんどやっても改善されません。
Groupとかではなくて全体の$middlewareに入れて試しました。
次にbootstrap/app.phpに入れてみようと思いました。
最後のreturn $app
の手前に入れてみようと思いましたがそもそもLaravelが起動しませんでした。
次に全てAPIリクエスト時なので、もしかしてRoute/api.phpでいけるのか?と思いまして試したのですがコード自体は実行されるようですが認証周りに影響が出るのか、Authの動作がおかしくなるのか、ログイン処理後一旦認証されるのですがログイン後の画面に遷移した時点でログインしていないことになってしまいます。
毎API呼び出し時にsetTestNowが走るので不正扱いされてしまうのか?と思いましたが確認方法がわかりませんでしたので一旦保留しました。
次に全てのリクエストを受け付けているであろうpublic/index.phpの最後に入れてみる事をしてみました。
いれるなら$appが作成された後だろうと思い、index.phpの最後にsetTestNowを入れてみると実行自体はされて、その時点のログには指定した時間がセットされたのがわかりました。
ですが実際にAPI呼び出しされ、コントローラーで時間を確認するとそこまでの間で初期化されてしまうのか通常の時間に戻ってしまっていました。
該当のソースコード
Laravel
1//実際は上の方でファサード等のuseをしています 2if (Config::get('app.env') == "local") { 3 try { 4 Log::info(Auth::guard(LoginConsts::ADMIN)->check()); 5 Carbon::setTestNow("2024-4-1 00:00:00"); 6 Log::info(Carbon::now('Asia/Tokyo')->format('Y-m-d H:i:s')); 7 } catch (\Exception $ex) { 8 Log::error($ex->getMessage()); 9 Log::error($ex->getLine()); 10 } 11}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
おそらくsetTestNowの想定がテスト時の為にこういう動作なのかと思いますが、そもそも発想がまずいのか、何かを勘違いしているのかヒントを頂けませんでしょうか?
よろしくお願いいたします。
補足
特になし