Laravelでプログラム側からartisanコマンドを実行する

noimage Laravel

こんにちは。

Laravelで開発を行っている時に実はサーバーでCUIが使えない、SSHでのアクセスが出来ないといったことは稀にあると思います。

そんな時パッと思いつく困ることがデータベースのマイグレーションが出来ない、storageへのリンクを貼れないことです。

他にも使用頻度が多そうなものとしてはメンテナンスモードの有効化、無効化やキャッシュ周りでしょうか。

解決方法としてはCUIで操作出来るようにするのが正解なのですが、状況によっては難しいですよね。

ということで、今回はプログラム側からartisanコマンドを実行する方法を紹介します。

 

スポンサーリンク

ルートの設定

/artisan/{コマンド名}にアクセスでコマンドを実行します。

Route::get('artisan/{request}', 'Controller@artisan');

今回はサンプルなのでルートは適当に設定しています。

実際に使用する場合は管理者でしかアクセス出来ないようにするなど、しっかりとアクセスに制限をかけてください。

コントローラーからartisanコマンド実行

Artisanクラスのcallメソッドを使用することで、プログラム側からartisanコマンドを使用することが出来ます。

第1引数にはコマンド、第2引数にはオプションを配列で指定します。

 

今回はルートで最初から追加されているコントローラーを指定しているのでartisan:makeコマンドは使用しません。

App\Http\Controllers\Controllerに追記していきます。

    public function artisan($cmd)
    {
        switch ($cmd) {
            case 'dbmigrate': //マイグレーション
                $exit = \Artisan::call('migrate', [
                        '--force' => true,
                    ]);
                break;
            case 'dbrollback': //ロールバック
                $exit = \Artisan::call('migrate:rollback', [
                    '--force' => true,
                ]);
                break;
            case 'storage': //public/storage→storage/app/publicにシンボリックリンク作成
                $exit = \Artisan::call('storage:link');
                break;
            case 'down': //メンテナンスモード有効(メンテナンスモードの適用対象に制限をかけないと復帰できなくなります)
                $exit = \Artisan::call('down');
                break;
            case 'up': //メンテナンスモード無効
                $exit = \Artisan::call('up');
                break;
            case 'cache': //キャッシュ全消去
                $exit = \Artisan::call('cache:clear');
                break;
            default:
                return view('welcome');
                break;
        }

        return dd($exit);
    }

基本的にはどのaritsanコマンドも実行出来る感じだと思います。

ただ、メンテナンスモードのようにコマンド実行後システムにアクセス出来ない状態になると操作出来なくなるので注意が必要です。

 

さいごに

Laravelでプロジェクトを進めていてCUIを使用出来ない場面は少ないと思いますが、私は直面して困ってしまったのでメモとして残しておきます。

これをクラス化しておけば便利そうではありますね。

 

 

 

 

コメント

タイトルとURLをコピーしました