得到Artisan电话的回复

cen*_*ob8 17 php laravel laravel-4

当我在终端中运行php artisan migrate时,当确实没有任何迁移时,会导致"无法迁移".

当我Artisan::call('migrate')在代码中使用(在自定义Artisan命令中使用它)时,这不会返回任何消息.它只是执行代码而没有任何反馈.

如果我vardump()Artisan::call方法的结果,它只返回一个int(0)

是否有可能得到Artisan调用方法的响应?

PiT*_*ber 20

对于使用Laravel 5.1的所有这些都没有用,但你可以简单地使用:

Artisan::output()
Run Code Online (Sandbox Code Playgroud)


Jef*_*ert 9

所有命令的返回结果都在类Symfony\Component\Console\Command\Command,方法中定义run:

return is_numeric($statusCode) ? (int) $statusCode : 0;
Run Code Online (Sandbox Code Playgroud)

$statusCode变量是通过调用命令的设置execute方法,该方法在技术人员的情况下,在类定义Illuminate\Console\Command:

protected function execute(InputInterface $input, OutputInterface $output)
{
    return $this->fire();
}
Run Code Online (Sandbox Code Playgroud)

fire方法的结果由单个命令决定,在命令的情况下,php artisan migrate从方法返回任何内容,因此$statusCode为null(这就是为什么从Symfony\Component\Console\Command\Command::run方法返回0 )

如果你想从自定义命令中获得响应,只需从你的fire方法返回一个整数,它就会冒回来$statusCode.您可以使用它以编程方式切换自定义命令的不同结果.

如果您特别想从artisan:migrate命令中获取结果,那么除了在您自己调用它的自定义命令中包装命令之外,我认为您无法更改返回值.


小智 7

我能够通过以下方式获得Artisan :: call()的输出:

use Symfony\Component\Console\Output\StreamOutput;

$stream = fopen("php://output", "w");
Artisan::call("migrate", array(), new StreamOutput($stream));

var_dump($stream);
Run Code Online (Sandbox Code Playgroud)


bis*_*hop 5

是的,有可能。要从自定义命令中获取内置artisan命令的输出,OutputStream请将命令中的传递到中Artisan::call。例:

class MyCommand extends \Illuminate\Console\Command
{
    public function fire()
    {
        \Artisan::call('optimize', [], $this->getOutput());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @trysis:反斜杠完全限定[namespace](http://php.net/manual/en/language.namespaces.php)。Artisan在全局命名空间中:MyCommand可能不在。 (3认同)