データベースの切り替え作業のためにメンテナンスページを用意しようと思ったら、Laravelが用意してくれていた。
調べたことをメモする。
結論
php artisan down でメンテナンスモードに移行できる(簡単!)
Laravelのメンテナンスモード時の挙動は以下の通り
HttpExceptionを投げて503ステータスを返す
オプションのパラメータで任意の挙動にアレンジすることも可能
やったこと
コマンドはこれだけ使った。
code:bash
php artisan down
php artisan up
APP_DEBUGの環境変数によってエラーハンドリングの挙動が変わってしまったので、Hander.phpの実装変更も一緒に対応した。
ローカルではAPP_DEBUG=true、ステージングではAPP_DEBUG=falseだったので下記Appendixに記載した通り条件に引っかからず一般的なエラーがレンダリングされていた。
code:php
// Handler.php内ではこういう条件でエラーをキャッチした
if ($e instanceof HttpException && $e->getStatusCode() === 503) {
return response()->view('errors.503', [], 503);
}
メンテナンスモードは503を投げるので、ServiceUnavailableHttpExceptionを直接キャッチできるかと思ったがそうではないようだった。
なので、HttpExceptionとステータスコード503を組み合わせて条件分岐を実装した。
Appendix
下部にこういう実装があり、config('app.debug')を見落としていたのであった。この条件分岐の良し悪しはあると思うのが・・・。
code:php
if (config('app.debug') || $e instanceof ValidationException || $e instanceof AuthenticationException) {
return parent::render($request, $e);
}
$errorMessage = $e->getMessage();
Log::error($errorMessage);
return response()->view('errors.basic');
【検討】
アプリケーションにユーザー画面と管理画面があり、サブドメインでルーティングを分けている時、いい感じにヘッダーなどのCSSを切り替える、もしくはレイアウトのbladeを切り替えるような実装を検討したい。