Laravel Console Commandに引数・配列などを渡して実行する

LaravelではConsole Commandが使えます。

▼ こういう用途に使える

  • Laravel内でタスクの定期実行
  • Cronジョブに登録して定期実行
  • あるいはコマンドとして直接実行

このConsoleCommandへの引数渡しについて

引数には単純な値はもちろん、
工夫すれば配列・連想配列も渡すこと可能です。

Commandへの基本的なコマンド変数の設定・渡し方

まず単純な例から考えてみます。

コマンド引数を1つだけ受け取ってみます。

▼ まず適当なcommandを作成

▼ app/Console/Commands/TestArg.phpの内容例

ポイントは $signature  に対して {your_name}  のように引数の識別名を渡すことです。これはCommand上での名前であり、実際のコマンド上では使われません。

そして実処理がスタートしたら $this->argument('your_name')  のようにしてコマンド引数を取得できます。

作成したコマンドに引数を渡して実行

上記コマンドをartisanから実行してみます。

▼ こういう風にコマンド引数を渡せる

たったこれだけです。

コマンド変数の {your_name}  という名前はCommand内での識別名なので、コマンド実行時には気にする必要はありません。ただ値を渡せばいいだけです。

2つ以上のコマンド引数を渡すのも簡単だが…

▼ また適当にコマンドを作ってみる

▼ app/Console/Commands/TestArgs.phpの内容例

▼ コマンドの実行例

ここまでは難しいことはありません。

複雑な配列・連想配列などをCommandに渡すには...

問題は配列・連想配列を渡したい場合

当然そのままコマンド引数としては渡せません。

JSONなどに変換して渡すのもダメでした

そこで登場するのが以下の関数

▼ serialize関数について

値の保存可能な表現を生成します。型や構造を失わずに PHP の値を保存または渡す際に有用です。シリアル化された文字列を PHP の値に戻すには、 unserialize() を使用してください。

引用元 : https://www.php.net/manual/ja/function.serialize.php

▼ escapeshellarg関数について

escapeshellarg() は、文字列をシングルクオート で括り、既存のシングルクオートを全てクオート/エスケープします。こ れにより、文字列を直接シェル関数に渡し、単一の安全な引数として処 理することを可能にします。この関数は、ユーザー入力からの入力を シェル関数への引数として渡す際にエスケープするために使用する必要 があります。シェル関数には、exec(), system()そして バッククォート演算子 を含むシェル関数が含まれます。

引用元 : https://www.php.net/manual/ja/function.escapeshellarg

まず serialize関数を使ってオブジェクト・配列・連想配列をシリアライズ化 → そのあと escapeshellarg関数を使ってコマンドとして安全な形に整形するという流れです。

配列をserialize()を使ってCommand引数に渡す

実際に簡単な配列をCommandの引数として渡してみます。

もちろん同じ方法でオブジェクトなども渡せます。

▼ またまた適当にコマンドを作ってみる

▼ app/Console/Commands/ReceiveArray.phpの内容例

▼ コマンドをPHPコードから実行

▼ 実行の出力結果

しっかりと受け取れてます。

同じ要領でオブジェクト・連想配列も渡せます。

以上、Laravel Commandに配列を渡す方法でした。

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください