Как моя команда может передать необязательные аргументы другой команде Artisan?

(Обновленный вопрос, чтобы показать, что это не похоже на связанные вопросы)

Я написал команду Laravel (показана полностью ниже), которая в основном является оболочкой для Dusk, так что я могу быть уверен, что заранее вызову некоторые другие функции. (В противном случае я неизбежно забуду обнулить свою среду тестирования.)

Это отлично работает, когда я бегу php artisan mydusk,

namespace App\Console\Commands;

class DuskCommand extends BaseCommand {

    protected $signature = 'mydusk {file?} {--filter=?}';
    protected $description = 'refreshAndSeedTestingDb, then run Dusk suite of tests';

    public function handle() {
        $this->consoleOutput($this->description);
        $resetTestingEnv = new ResetTestingEnv();
        $resetTestingEnv->refreshAndSeedTestingDb();
        $this->consoleOutput('refreshAndSeedTestingDb finished. Now will run Dusk...');
        $file = $this->argument('file');//What to do with this?
        return \Artisan::call('dusk', ['--filter' => $this->option('filter')]);
    }

}

Как вы видите, я уже прочитал эти документы и понимаю, как написать $signature принять необязательные аргументы.

Моя цель - уметь иногда бегать php artisan mydusk а также иметь возможность добавлять аргументы, например, когда я могу захотеть вызвать что-то вроде php artisan mydusk tests/Browser/MailcheckTest.php --filter testBasicValidCaseButtonClick (который пройдет tests/Browser/MailcheckTest.php --filter testBasicValidCaseButtonClick доводы до нормального dusk команда).

Как я могу редактировать последние 2 строки моего handle() функционировать так, чтобы $file передается в dusk ?

4 ответа

Используйте подпись без '-' для предоставления аргументов

      return \Artisan::call('dusk', ['file' => $file , '--filter' => $this->option('filter')]);

В документации есть пример, но он не указан четко (предполагается, что вы следовали всем утверждениям в разделах выше)

Для подписи ниже

      protected $signature = 'email:send {user} {--queue}';

Это дает (очень далеко ниже) этот пример как вызов команды Artisan из других команд.

      public function handle()
{
    $this->call('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);
}

https://laravel.com/docs/5.6/artisan#calling-commands-from-other-commands

Я был удивлен, узнав из своих экспериментов, что моя оригинальная функция на самом деле работает, как я хотел, и я могу удалить инертную линию ($file = $this->argument('file');).

Проходя file спорить через \Artisan::call() на самом деле не кажется необходимым вообще.

Ответ @ Фубара, похоже, сделал те же ошибочные предположения, что и я.

Как @Jonas Staudenmeir намекнул в комментарии, Laravel\Dusk\Console\DuskCommand использует аргументы из $_SERVER['argv'],

Изначально я неправильно понял ваш вопрос. Однако в документации также есть раздел, в котором описывается, как программно вызывать команду Artisan.

Исходя из вашего вопроса, я предполагаю, что вы не знаете, как пройти file аргумент, потому что при вызове в качестве команды, нет key, так сказать.

php artisan mydusk {file?} {--filter=}

Следующая информация взята из документации Laravel. key для file Аргумент должен быть именем аргумента. Что касается аргумента, являющегося необязательным, если file аргумент не указан, когда mydusk команда называется, тогда null будет передан в dusk команда.

public function handle() {
    // ...

    $file = $this->argument('file');
    $filter = $this->option('filter');

    return Artisan::call('dusk', [
        'file'     => $file,
        '--filter' => $filter,
    ]);
}

Вы также можете взглянуть на эти ссылки, это может вам помочь.

Ответ стека 1

Стек Ответ 2

Другие вопросы по тегам