24

In the shell I can create a database migration (for example) like so:

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

Using Artisan::call() I can't work out how to pass a non-argument parameter ("mymigration" in this example). I have tried many variants of the code below:

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

Anyone got any ideas? I have been using shell_exec('./artisan ...') in the meantime but I'm not happy with the approach.

4

6 回答 6

24

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

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

于 2014-10-02T11:14:57.130 回答
23

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

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

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

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

$this->option('optionwithoutvalue'); //returns true
于 2015-07-30T14:19:40.327 回答
15

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

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

于 2015-07-20T23:19:09.567 回答
4

我知道这个问题已经很老了,但这首先出现在我的谷歌搜索中,所以我会在这里添加。@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']]);
于 2018-10-24T18:13:12.353 回答
2

在您的命令中添加 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]);

有关详细信息,请参阅这篇文章

于 2016-12-21T14:01:14.487 回答
0

利用

Artisan::call('db:migrate', ['--table' => 'mytable', 'mymigration'=>true])
于 2020-05-09T21:27:13.573 回答