使用Artisan :: call()传递非选项参数

时间:2014-10-02 11:01:52

标签: php laravel artisan

在shell中我可以像这样创建数据库迁移(例如):

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

使用Artisan :: call()我无法弄清楚如何传递非参数参数(在本例中为“mymigration”)。我已尝试过以下代码的许多变体:

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

有人有任何想法吗?我一直在使用shell_exec('。/ artisan ......'),但我对这种方法不满意。

6 个答案:

答案 0 :(得分:17)

Artisan::call('db:migrate', ['' => 'mymigration', '--table' => 'mytable'])应该有用。

顺便说一下db:migrate并不是一个开箱即用的工匠命令。你确定这是对的吗?

答案 1 :(得分:11)

在laravel 5.1中,当您从PHP代码调用Artisan命令时,可以使用/不设置值来设置选项。

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

在这种情况下,在你的工匠命令中;

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

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

答案 2 :(得分:10)

如果您使用的是Laravel 5.1或更高版本,解决方案会有所不同。现在你需要做的是你需要知道命令签名中赋予参数的名称。您可以使用php artisan help后跟命令名从命令shell中找到参数的名称。

我想你想问一下“make:migration”。因此,例如php artisan help make:migration向您显示它接受名为“name”的参数。所以你可以这样称呼:Artisan::call('make:migration', ['name' => 'foo' ])

答案 3 :(得分: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]);

有关详细信息,请参阅此article

答案 4 :(得分:1)

我知道这个问题已经很老了,但是这个问题首先出现在我的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']]);

答案 5 :(得分:0)

使用

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