Laravelでメンテナンスモードを導入する方法

15 回閲覧されました
みなさんこんにちは、jonioです。
今回はLaravelでメンテナンスモードを導入する方法を解説したメモの記事になります。
Laravelのバージョン
10系で動作確認をしましたが8系や9系でも動作するみたいです。
web.php
下記の記述をします。
Route::post('/admin/maintenance/on', 'maintenanceOn')->name('maintenance.on');
Route::post('/admin/maintenance/off', 'maintenanceOff')->name('maintenance.off');
1行目はメンテナンス状態にする場合で3行目はメンテナンスを解除する場合です。
コントローラー
下記の記述をします。
public function maintenanceOn() {
Artisan::call('down', [
'--secret' => 'aiueo'
]);
}
public function maintenanceOff() {
Artisan::call('up');
}
メンテナンスモードにするとターミナルでコマンドを使ってメンテナンス状態を解除しないといけないですがかなり面倒です。
特定のキーワードのURLからアクセスできるようにします。
それが3行目の「aiueo」です。
「aiueo」は任意の文字列で大丈夫です。
これでメンテナンスモードにした時に「https://url/aiueo」にアクセスすれば通常のアクセスができます。
誰でもアクセスできるので自分しか分からない文字列にした方がいいです。
テンプレート
下記の記述をします。
@if (app()->isDownForMaintenance())
<form method="POST" action="{{ route('maintenance.off') }}">
@csrf
<button type="submit" class="btn btn-info">メンテナンス終了</button>
</form>
@else
<form method="POST" action="{{ route('maintenance.on') }}">
@csrf
<button type="submit" class="btn btn-danger">メンテナンス開始</button>
</form>
@endif
1行目の「app()->isDownForMaintenance()」はメンテナンス中という意味です。
メンテナンス中かそうでないかで表示するボタンを切り替えています。
メンテナンス用のページの表示
メンテナンス用のページを用意しない場合はメンテナンスの状態にしてどこかのページにアクセスすると503のエラーが表示されます。
だからメンテナンス用のページを用意します。
下記のコマンドを叩きます。
php artisan vendor:publish --tag=laravel-errors
すると「Laravelのプロジェクト > resources > views > errors > 503.blade.php」が作成されるのでファイルの中身を下記に変更します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>メンテナンス中</title>
<style>
body { text-align: center; padding: 50px; font-family: Arial, sans-serif; }
h1 { font-size: 50px; color: #ff0000; }
p { font-size: 20px; }
</style>
</head>
<body>
<h1>サイトはメンテナンス中です</h1>
<p>しばらくお待ちください。</p>
</body>
</html>
これで完成です。