LaravelではConsole Commandが使えます。
▼ こういう用途に使える
- Laravel内でタスクの定期実行
- Cronジョブに登録して定期実行
- あるいはコマンドとして直接実行
このConsoleCommandへの引数渡しについて
引数には単純な値はもちろん、
工夫すれば配列・連想配列も渡すこと可能です。
このページの目次
Commandへの基本的なコマンド変数の設定・渡し方
まず単純な例から考えてみます。
コマンド引数を1つだけ受け取ってみます。
▼ まず適当なcommandを作成
1 |
> php artisan make:command ReceiveArg |
▼ app/Console/Commands/TestArg.phpの内容例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class ReceiveArg extends Command { protected $signature = 'test:receivearg {your_name}'; protected $description = '引数を1つだけ受け取る'; public function __construct() { parent::__construct(); } public function handle() { /// 1番目の引数を受け取る $your_name = $this->argument('your_name'); echo 'your name is '.$your_name; return Command::SUCCESS; } } |
ポイントは $signature に対して {your_name} のように引数の識別名を渡すことです。これはCommand上での名前であり、実際のコマンド上では使われません。
そして実処理がスタートしたら $this->argument('your_name') のようにしてコマンド引数を取得できます。
作成したコマンドに引数を渡して実行
上記コマンドをartisanから実行してみます。
▼ こういう風にコマンド引数を渡せる
1 2 3 |
> php artisan test:receivearg "Pisuke" your name is Pisuke |
たったこれだけです。
コマンド変数の {your_name} という名前はCommand内での識別名なので、コマンド実行時には気にする必要はありません。ただ値を渡せばいいだけです。
2つ以上のコマンド引数を渡すのも簡単だが…
▼ また適当にコマンドを作ってみる
1 |
> php artisan make:command ReceiveArgs |
▼ app/Console/Commands/TestArgs.phpの内容例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class ReceiveArg extends Command { /// 2つの引数を受け取ることにする protected $signature = 'test:receiveargs {x} {y}'; /// 省略... public function handle() { /// 1番目の引数を受け取る $x = $this->argument('x'); /// 2番目の引数を受け取る $y = $this->argument('y'); echo 'x * y = '.($x*$y); return Command::SUCCESS; } } |
▼ コマンドの実行例
1 2 3 |
> php artisan test:receiveargs 2 30 x * y = 60 |
ここまでは難しいことはありません。
複雑な配列・連想配列などをCommandに渡すには...
問題は配列・連想配列を渡したい場合
当然そのままコマンド引数としては渡せません。
JSONなどに変換して渡すのもダメでした
そこで登場するのが以下の関数
▼ serialize関数について
値の保存可能な表現を生成します。型や構造を失わずに PHP の値を保存または渡す際に有用です。シリアル化された文字列を PHP の値に戻すには、 unserialize() を使用してください。
▼ escapeshellarg関数について
escapeshellarg() は、文字列をシングルクオート で括り、既存のシングルクオートを全てクオート/エスケープします。こ れにより、文字列を直接シェル関数に渡し、単一の安全な引数として処 理することを可能にします。この関数は、ユーザー入力からの入力を シェル関数への引数として渡す際にエスケープするために使用する必要 があります。シェル関数には、exec(), system()そして バッククォート演算子 を含むシェル関数が含まれます。
まず serialize関数を使ってオブジェクト・配列・連想配列をシリアライズ化 → そのあと escapeshellarg関数を使ってコマンドとして安全な形に整形するという流れです。
配列をserialize()を使ってCommand引数に渡す
実際に簡単な配列をCommandの引数として渡してみます。
もちろん同じ方法でオブジェクトなども渡せます。
▼ またまた適当にコマンドを作ってみる
1 |
> php artisan make:command ReceiveArray |
▼ app/Console/Commands/ReceiveArray.phpの内容例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class ReceiveArray extends Command { /// 1つの配列を受け取ることにする protected $signature = 'test:receivearray {arr}'; /// 省略... public function handle() { /// 1番目の引数を受け取る $arr = unserialize($this->argument('arr')); foreach($arr as $i => $v){ echo "arr[{$i}] : {$v}"; } return Command::SUCCESS; } } |
▼ コマンドをPHPコードから実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$arr = [ 'hoge', 'fuga', 'piyo' ]; $esc_arr = escapeshellarg( serialize($arr) ); $command = " php artisan test:receivearray {$esc_arr} "; exec($command); |
▼ 実行の出力結果
1 2 3 |
arr[0] : hoge arr[1] : fuga arr[2] : piyo |
しっかりと受け取れてます。
同じ要領でオブジェクト・連想配列も渡せます。
以上、Laravel Commandに配列を渡す方法でした。