【Laravel11】Artisan Consoleのコマンドライン引数

Laravel

Laravel11のArtisan Consoleのコマンドライン引数についての解説です。公式ドキュメントに書かれていない内容もあります。

この記事のゴール

Artisan Consoleの

  • コマンドライン引数の使い方がわかる
  • 引数省略時の対話入力処理がわかる

前提条件

  • PHP8.2以降インストール済
  • Composerインストール済

Laravel新規プロジェクト作成

Laravel11の新規プロジェクト「artisan-console」を作成します。

composer create-project laravel/laravel:^11 artisan-console

プロジェクトフォルダに入ります。

Artisanコマンド作成

Artisanコマンド「app:foo」を作ります。

php artisan make:command Foo

「app/Console/Commands/Foo.php」が作成されます。

これがコマンド「app:foo」の本体になります。

中身を見てみましょう。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class Foo extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:foo';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        //
    }
}

「$signature」がコマンドの名称設定(名前空間)になります。

実行時には「php artisan app:foo」で呼び出しされます。

    protected $signature = 'app:foo';

aritsanコマンドとして未登録の名称なら好きに設定できます。

名前空間なので、階層を深くして体系化することもできます。

    protected $signature = 'app:foo:bar:baz:qux';

「$description」がコマンドの説明です。

    protected $description = 'Command description';

これらはartisanコマンドの登録リストで表示されます。

php artisan list

「handle()」メソッドがコマンドの処理の本体です。

    public function handle()

今はまだ何も記述していないので何も処理されません。

試しに実行してみましょう。

php artisan app:foo

また、引数の設定がされていないので、

この状態で引数を付けて実行するとエラーになります。

オプションも同様です。

引数の基本的な使い方

コマンドライン引数の設定は「$signature」に記述します。

    protected $signature = 'app:foo:bar {arg}';

波括弧で囲まれた部分に引数名を記述します。

この場合、引数名は「arg」になります。

「handle()」メソッド側での引数の受取は

$this->argument('arg')

のように「argument()」メソッドの引数に引数名を指定します。

コマンドライン引数は全て文字列型で渡されます。

「handle()」メソッドを次のようにしてみます。

    public function handle()
    {
        var_dump($this->argument('arg'));
    }

これで引数を指定して実行してみましょう。

php artisan app:foo bar

数値を引数にしてみます。

php artisan app:foo 123

文字列型として渡されています。

数値を扱う際には型変換が必用です。

また、ここで設定した引数は必須設定なので、

引数を省略して実行すると叱られます。

引数のデフォルト値

引数のデフォルト値を設定することで、

引数省略時にも処理続行できるようにします。

    protected $signature = 'app:foo {arg=bar}';

変数名に続けて「=」とデフォルト値を記述します。

引数を省略して実行してみます。

引数を付けて実行してみます。

引数を付け過ぎると叱られます。

引数の省略可設定

「$signature」の引数名に「?」を付けると省略可能になります。

    protected $signature = 'app:foo {arg?}';

引数を省略して実行してみます。

引数が渡されていないのでNULL出力されました。

引数を付けて実行してみます。

引数を付け過ぎると叱られます。

複数の引数設定

次のようにすることで複数の引数を設定できます。

    protected $signature = 'app:foo {arg1} {arg2}';

引数名を変えたので「handle()」メソッドも修正します。

    public function handle()
    {
        var_dump(
            $this->arguments()
        );
    }

「argument(‘arg1’)」「argument(‘arg2’)」でも受け取れますが、

複数にしたので「arguments()」」でまとめて受け取るようにしています。

引数を付けて実行してみます。

ここで注意なのは、「arguments()」の戻り値の第一要素は

コマンドの名前空間になり、その後の要素が引数になります。

引数の省略設定には注意が必用です。

これはPHPの関数と同様のルールが適用されます。

全てを省略設定するか、

    protected $signature = 'app:foo {arg1?} {arg2?} {arg3?}';

一部の場合は、省略設定した引数より後ろの引数が全て省略設定されなければなりません。

    protected $signature = 'app:foo {arg1} {arg2?} {arg3?}';

前方の引数だけ省略設定すると、実行時にどの引数に値を渡すのか判定できなくなるためです。

次のような設定はNGです。

    protected $signature = 'app:foo {arg1?} {arg2}';

これで実行すると叱られます。

配列引数

ユーザーIDなど同じ項目の引数を複数渡したいときには

配列引数の設定ができます。

    protected $signature = 'app:foo {userid*}';

「handle()」メソッド側も修正しておきます。

    public function handle()
    {
        var_dump($this->argument('userid'));
    }

ユーザーIDを複数指定して実行してみます。

php artisan app:foo 2 4 6

指定した複数のユーザーIDが、一つの引数「userid」に配列として渡されました。

一つ一つの要素は文字列として渡されます。

複数の引数設定と組み合わせることもできますが、

この際も注意が必用です。

配列引数は一番後ろに設定しなければなりません。

    protected $signature = 'app:foo {subject} {userid*}';

「handle()」メソッドも修正しておきます。

    public function handle()
    {
        var_dump($this->arguments());
    }

実行してみます。

php artisan app:foo bar 2 4 6

このように配列引数の後ろに別の引数を設定した状態で実行すると叱られます。

    protected $signature = 'app:foo {userid*} {subject}';

引数省略時の対話入力設定

引数省略時の対話入力設定については別記事にしてあります。

こちらをご覧ください。

引数の説明記述

次のように、引数名の後ろに「 : 」に続けて引数の説明を記述できます。

コロンの前後には半角スペースが必用です。

    protected $signature = 'app:foo {arg : 引数(必須)です。}';

「–help」オプションを付けて実行すると確認できます。

php artisan app:foo --help

複数の引数の場合、説明を記述すると長くなります。

次のように改行して記述することもできます。

    protected $signature = 'app:foo {arg1  : 第一引数(必須)です。}
                                    {arg2  : 第二引数(必須)です。}
                                    {arg3? : 第三引数(省略可)です。}';

今回は以上です。

コマンドラインオプションについては次の記事をご覧ください。

コメント

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