Laravel は PHP フレームワークのひとつで artisan は Laravel に組み込まれているコンソールコマンドのことです。PHP の開発ツール用のコマンドでもあり、データベースの操作など色々なことができます。色々できることもあり、コマンドの中には開発中、テスト中には便利ながらも本番環境上で実行してはいけないコマンドがしばしばあります。例えば migration:fresh です。migration:fresh は次の説明の通り全テーブルをドロップした新しくテーブルを作り直すコマンドです。これを本番環境で実行した場合、消してはいけないデータをごっそり消していしまいます。
Drop all tables and re-run all migrations
この様なコマンドを誤って実行する前にプログラムで停止する仕組みの作り方を紹介します。
コマンド実行前にプログラムを停止する処理を実現する方法の一つは artisan 実行の基盤になるクラスの記述されたファイル app/Console/Kernel.php に次の様に追記をする方法で、これは次のコードの様にできます。
// app/Console/Kernel.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Str;
/**
* コンソールのカーネル
* Class Kernel
*/
class Kernel extends ConsoleKernel
{
public function handle($input, $output = null)
{
$this->bootstrap();// Laravel 関連の色々を使うために実行するべきメソッド
if (Str::contains(config('database.connections.mysql.host'), '192.168')) {
// 192.168以下のプライベートIPアドレス範囲の DB(データベース)に接続するならば特別禁止することはなくそのまま実行
return parent::handle($input, $output);
}
// プライベートIPアドレス範囲外ならば色々と処理
foreach ($_SERVER['argv'] as $arg) {
// $_SERVER['argv'] でコマンドライン引数を取得。列挙して処理
if (Str::contains($arg, 'migrate:fresh')) {
// もしコマンドライン引数に migrate:fresh が含まれていたならば dd でコマンド実行前に処理を打ち切り
/* @noinspection ForgottenDebugOutputInspection */
dd('STOP! DB_HOST is '.config('database.connections.mysql.host').'. Don\'t migrate:fresh.');
}
}
// 特別打ち切りをする必要がないならば予定されていた処理を実行
return parent::handle($input, $output);
}
/** デフォルトのままなので省略 */
適宜 if 分の中身、停止時メッセージを変更することで応用が効きます。この様なコードを作っておけばオペミスに繋がる様なコマンドを実行してしまってもプログラムが止めてくれます。
追記:.env に APP_ENV=production と記述された本物の本番環境ならば危険行為は Laravel がいい感じに止めてくれます。データベース接続だけ外部に見せる環境にするような横着はやめましょう