Использование Artisan :: call () для передачи неопционных аргументов

В оболочке я могу создать миграцию базы данных (например) следующим образом:

./artisan migrate:make --table="mytable" mymigration

Используя Artisan :: call (), я не могу понять, как передать параметр без аргументов (в данном примере «mymigration»). Я попробовал много вариантов кода ниже:

Artisan::call('db:migrate', ['--table' => 'mytable', 'mymigration'])

У кого-нибудь есть идеи? Тем временем я использовал shell_exec (‘./ artisan …’), но я не доволен этим подходом.

16

Решение

Artisan::call('db:migrate', ['' => 'mymigration', '--table' => 'mytable']) должно сработать.

Между прочим, db: migrate не является мастерской командой из коробки. Вы уверены, что это правильно?

17

Другие решения

Решение другое, если вы используете Laravel 5.1 или новее. Теперь вам нужно знать имя, которое было присвоено аргументу в подписи команды. Вы можете найти имя аргумента в командной оболочке, используя php artisan help сопровождаемый именем команды.

Я думаю, что вы хотели спросить о «make: миграция». Так, например php artisan help make:migration показывает, что он принимает параметр с именем «имя». Таким образом, вы можете назвать это так: Artisan::call('make:migration', ['name' => 'foo' ]),

9

В laravel 5.1 вы устанавливаете параметры со значениями / без значений при вызове команды Artisan из своего кода PHP.

Artisan::call('your:commandname', ['--optionwithvalue' => 'youroptionvalue', '--optionwithoutvalue' => true]);

в этом случае, внутри вашей команды ремесленника;

$this->option('optionwithvalue'); //returns 'youroptionvalue'

$this->option('optionwithoutvalue'); //returns true
9

Я знаю, что этот вопрос довольно старый, но он появился первым в моем поиске в Google, поэтому я добавлю его сюда. Ответ @ orrd верный, но я также добавлю, что для случаев, которые используют массив аргументов, где вы используете звездочку * Вы должны предоставить аргумент (ы) в виде массива.

Например, если у вас есть команда, которая использует аргументы массива с такой подписью, как:

protected $signature = 'command:do-something {arg_name*}';

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

$this->call('command:do-something', ['arg_name' => ['value']]);
$this->call('command:do-something', ['arg_name' => ['value', 'another-value']]);
1

В вашей команде вы добавляете getArguments ():

/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return array(
array('fdmprinterpath', InputArgument::REQUIRED, 'Basic slice config path'),
array('configpath', InputArgument::REQUIRED, 'User slice config path'),
array('gcodepath', InputArgument::REQUIRED, 'Path for the generated gcode'),
array('tempstlpath', InputArgument::REQUIRED, 'Path for the model that will be sliced'),
array('uid', InputArgument::REQUIRED, 'User id'),
);
}

Вы можете использовать аргументы:

$fdmprinterpath = $this->argument('fdmprinterpath');
$configpath     = $this->argument('configpath');
$gcodepath      = $this->argument('gcodepath');
$tempstlpath    = $this->argument('tempstlpath');
$uid            = $this->argument('uid');

Вызов команды с параметрами:

Artisan::call('command:slice-model', ['fdmprinterpath' => $fdmprinterpath, 'configpath' => $configpath, 'gcodepath' => $gcodepath, 'tempstlpath' => $tempstlpath]);

Для получения дополнительной информации обратитесь к этому статья.

0