[Laravel] Console出力系のCommand一覧

\Illuminate\Console\Command クラスではスクリプト実行時にコンソール上にログなどを出力するメソッドがあります。

各メソッドにより、コンソール上で確認しやすくなるようにメッセージを色付けしてくれます。

バッチ処理などに使うJobや、Seeder等で利用されています。

    /**
     * Write a string as information output.
     *
     * @param  string  $string
     * @return void
     */
    public function info($string)
    {
        $this->output->writeln("<info>$string</info>");
    }

    /**
     * Write a string as standard output.
     *
     * @param  string  $string
     * @return void
     */
    public function line($string)
    {
        $this->output->writeln($string);
    }

    /**
     * Write a string as comment output.
     *
     * @param  string  $string
     * @return void
     */
    public function comment($string)
    {
        $this->output->writeln("<comment>$string</comment>");
    }

    /**
     * Write a string as question output.
     *
     * @param  string  $string
     * @return void
     */
    public function question($string)
    {
        $this->output->writeln("<question>$string</question>");
    }

    /**
     * Write a string as error output.
     *
     * @param  string  $string
     * @return void
     */
    public function error($string)
    {
        $this->output->writeln("<error>$string</error>");
    }

    /**
     * Write a string as warning output.
     *
     * @param  string  $string
     * @return void
     */
    public function warn($string)
    {
        if (! $this->output->getFormatter()->hasStyle('warning')) {
            $style = new OutputFormatterStyle('yellow');

            $this->output->getFormatter()->setStyle('warning', $style);
        }

        $this->output->writeln("<warning>$string</warning>");
    }

サンプル:

<?php
    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $this->command->info('info command');
            $this->command->line('line command');
            $this->command->comment('comment command');
            $this->command->question('question command');
            $this->command->error('error command');
            $this->command->warn('warn command');
        }
    }

また、コンソール上で対話可能なメソッドも用意されており、 入力によって異なる動作をする場合などに役立ちます。

$this->command->confirm()

確認を答うメソッドです。 戻り値として true | false が返却されます。

    /**
     * Confirm a question with the user.
     *
     * @param  string  $question
     * @param  bool    $default
     * @return bool
     */
    public function confirm($question, $default = false)
    {
        return $this->output->confirm($question, $default);
    }

サンプル:

<?php
    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            if($this->command->confirm('test question?')) {

                // 確認後に実行される
                $this->command->line('passed!');
            }
        }
    }

実行:

$ php artisan db:seed
 test question? (yes/no) [no]:
 > yes

passed!

$this->command->ask()

コンソールへの入力を求めるメソッドです。 戻り値として入力された内容が返却されます。

    /**
     * Prompt the user for input.
     *
     * @param  string  $question
     * @param  string  $default
     * @return string
     */
    public function ask($question, $default = null)
    {
        return $this->output->ask($question, $default);
    }

サンプル:

<?php
    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $ask = $this->command->ask('Enter Your Name.');

            // 入力された内容を受け取ります
            $this->command->line("Your name is {$ask}.");
        }
    }

実行:

$ php artisan db:seed

 Enter Your Name.:
 > xzxzyzyz

Your name is xzxzyzyz.

$this->command->askWithCompletion()

入力されるであろう内容を事前に登録しておくことで、コンソールでの入力を補完してくれます。 戻り値として入力された内容が返却されます。 ※ $this->command->anticipate() のエイリアスです。

    /**
     * Prompt the user for input with auto completion.
     *
     * @param  string  $question
     * @param  array   $choices
     * @param  string  $default
     * @return string
     */
    public function anticipate($question, array $choices, $default = null)
    {
        return $this->askWithCompletion($question, $choices, $default);
    }

    /**
     * Prompt the user for input with auto completion.
     *
     * @param  string  $question
     * @param  array   $choices
     * @param  string  $default
     * @return string
     */
    public function askWithCompletion($question, array $choices, $default = null)
    {
        $question = new Question($question, $default);

        $question->setAutocompleterValues($choices);

        return $this->output->askQuestion($question);
    }

サンプル:

    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $ask = $this->command->anticipate('Enter Your Name.', ['xzxzyzyz', 'yzyzxzxz']);

            // 入力された内容を受け取ります
            $this->command->line("Your name is {$ask}.");
        }
    }

実行:

$ php artisan db:seed

 Choice or Enter your name.:
 > xzxzyzyz

Your name is xzxzyzyz.

xを入力すると、xzxzyzyzを補完してくれるはずです。

$this->command->secret()

コンソールへの入力を求めるメソッドですが、入力内容が表示されません。 戻り値として入力された内容が返却されます。

    /**
     * Prompt the user for input but hide the answer from the console.
     *
     * @param  string  $question
     * @param  bool    $fallback
     * @return string
     */
    public function secret($question, $fallback = true)
    {
        $question = new Question($question);

        $question->setHidden(true)->setHiddenFallback($fallback);

        return $this->output->askQuestion($question);
    }

サンプル:

<?php
    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $ask = $this->command->secret('Enter Password.');

            // 入力された内容を受け取ります
            $this->command->line("Password is {$ask}.");
        }
    }

実行:

$ php artisan db:seed

 Enter Password.:
 >

Password is xzxzyzyz.

$this->command->choice()

用意した候補から、コンソール上で選択できます。 戻り値として選択された内容が返却されます。

    /**
     * Give the user a single choice from an array of answers.
     *
     * @param  string  $question
     * @param  array   $choices
     * @param  string  $default
     * @param  mixed   $attempts
     * @param  bool    $multiple
     * @return string
     */
    public function choice($question, array $choices, $default = null, $attempts = null, $multiple = null)
    {
        $question = new ChoiceQuestion($question, $choices, $default);

        $question->setMaxAttempts($attempts)->setMultiselect($multiple);

        return $this->output->askQuestion($question);
    }

サンプル:

<?php
    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;

    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $ask = $this->command->choice('Choice', ['xzxzyzyz', 'yzyzxzxz', 'etc..']);

            // 入力された内容を受け取ります
            $this->command->line("Choice is {$ask}.");
        }
    }

実行:

$ php artisan db:seed

 Choice:
  [0] xzxzyzyz
  [1] yzyzxzxz
  [2] etc..
 > 0

Choice is xzxzyzyz.

最後に

Laravel上では\Illuminate\Console\Commandクラスを参照していますが、 \Illuminate\Console\Commandで定義されている $this->outputには\Symfony\Component\Console\Style\SymfonyStyleが代入されており、 コンソール出力に関する動作はこちらを参考に。

© Xzxzyzyz