【Laravel】artisan コマンド実行による操作ミスを防ぐ処理の作り方

  • 2020年10月6日
  • 2020年10月8日
  • Laravel

 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 がいい感じに止めてくれます。データベース接続だけ外部に見せる環境にするような横着はやめましょう

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG