Laravel 5.4中Artisan::output()返回空值如何解决?
解决Laravel 5.4中Artisan::output()返回空字符串的问题
我来帮你搞定这个问题!在Laravel 5.4里,Artisan::output()返回空字符串通常是因为默认的调用方式没有正确捕获命令输出,或者你的backup:run命令没有输出预期的JSON内容。试试下面这几个方案:
方案1:使用Symfony的BufferedOutput捕获输出
Laravel 5.4的Artisan::call()默认不会自动把命令输出存入可通过Artisan::output()获取的缓冲区,你需要手动传入一个BufferedOutput实例来捕获输出:
use Symfony\Component\Console\Output\BufferedOutput; // 创建缓冲输出实例 $bufferedOutput = new BufferedOutput(); // 调用命令时传入缓冲输出 Artisan::call('backup:run', [], $bufferedOutput); // 从缓冲区获取输出内容 $outputContent = $bufferedOutput->fetch(); // 解析JSON $result = json_decode($outputContent);
方案2:确保backup:run命令输出JSON格式内容
如果你使用的是Spatie的laravel-backup包(这是最常用的备份扩展),backup:run命令默认输出的是人类可读的文本,而非JSON。你需要添加--json参数让它输出JSON:
use Symfony\Component\Console\Output\BufferedOutput; $bufferedOutput = new BufferedOutput(); // 传入--json参数 Artisan::call('backup:run', ['--json' => true], $bufferedOutput); $outputContent = $bufferedOutput->fetch(); $result = json_decode($outputContent);
方案3:捕获标准错误输出(如果命令输出到stderr)
有些命令会把内容输出到标准错误流而非标准输出,这时候你需要在创建BufferedOutput时开启错误流捕获:
use Symfony\Component\Console\Output\BufferedOutput; // 第二个参数设为true,合并捕获stdout和stderr $bufferedOutput = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true); Artisan::call('backup:run', ['--json' => true], $bufferedOutput); $outputContent = $bufferedOutput->fetch(); $result = json_decode($outputContent);
先在终端验证命令输出
在代码调试前,先在项目根目录运行终端命令,确认backup:run确实能输出内容:
php artisan backup:run --json
如果终端没有输出,那说明命令本身执行可能有问题(比如备份配置错误、没有可备份的内容),需要先排查命令的执行状态,再处理代码捕获的问题。
内容的提问来源于stack exchange,提问作者naseeba c
相关产品推荐
相关产品推荐

