a_hamada/ 2024年 8月 29日/ 技術

こんにちは、濱田です。
札幌もまだまだ湿度が高くて暑いです。

さて今回もLaravelについて書いていきます。
先日コード上からコマンドを呼び出す必要があり、その中ではまったことがあったので書いていきます。

はじめに

早速Laravelで定義したコマンドをコードから呼ぶ方法ですがArtisanファサードを使用して実現できます。

Artisan::call('command:signature')

上記コードの「command:signature」の部分にコマンドのsignatureで定義した値を設定することで
コマンドが実行できます。
引数がある場合はArtisan::callの第2引数に["{引数のkey}" => {引数に渡す値}]の書式で渡すことができます。

ハマったこと

次にこのArtisan::callを使っていてハマったことについてです。
正直今も原因が良くわかっていないのですが、起きたことと解消した方法を書いていきます。
私が開発していたLaravelのアプリケーションでは通常のログとコマンドやテストなどを
実行したときのログ出力を分けるように設定していました。
(logger.phpで設定するロギング設定です。ここでは詳細は割愛させていただきます。)
そして実際に実装したArtisan::callの呼び出し処理は呼び出し下記例のように
ajax経由でjavascriptコードから呼び出していました。

$.ajax({
    url: 'artisan-call',    ・・・Artisan::callを実行するURLを指定
    type: 'GET',
    success: function(response) {
        alert(response.message);
    },
    error: function(xhr, status, error) {
        alert('Error: ' + error);
    }
});

ですがそうするとなぜかArtisan::callが実行されたタイミングで、ログの出力先が通常のアプリケーションログから
コマンド実行時のログ出力に切り替わってしまいました。
しかも画面上の動作も処理が止まって固まってしまったような動きになっていました。
このような動作になることは全く予想していなかったので、解決策をいろいろ調べるも
解決につながる方法は見つからず…

解決した方法

原因が分からないままなのでアプローチを変えてみようとArtisan::callの処理をajaxで呼び出していたのを
以下のようにhtmlからform経由で呼び出すように変えてみました。

<form id="commandForm" action="/artisan-call" method="GET">
    @csrf
    <button type="submit">Artisan Call</button>
</form>

すると画面上の動作も想定通りの動作になり、ログもアプリケーションログに吐かれるようになりました。
結局何が起きていたのかすらよく分からず…

最後に

少し駆け足になってしまいましたが今回の内容は以上です。
その上原因もよく分からないという中途半端な結論にはなってしまいましたが
もし同じような現象で困っている人の助けになれば幸いです。
(こういう類の事象は深追いするととんでもない沼にハマリそうですし…)
どなたか原因が分かる方がいたら教えてほしい…

次回に関してはまだ何を書くかは来てていませんがまた詰まったことや新しくやったことを書いていこうと思います。
それではまた!

About a_hamada

2020年9月からWebプログラマに転向した半人前 日々勉強することばかり。 最近使っている言語はもっぱらPython