2015-06-14 75 views
22

我正在使用Laravel 5.1创建基于控制台的应用程序。在开发过程中,我想在出现错误时显示异常跟踪。但是,即使我在php artisan中使用-v -vv或-vvv选项,我也没有为我的自定义命令获取异常跟踪。我在.env中设置了APP_DEBUG=true,仍然没有任何例外迹象。如何在laravel控制台命令中显示异常跟踪?

php artisan some:unknowncommand输出为:

[InvalidArgumentException]        
There are no commands defined in the "some" namespace. 

php artisan -v some:unknowncommand输出为:

[InvalidArgumentException]        
    There are no commands defined in the "some" namespace. 

Exception trace: 
() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501 
Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535 
Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192 
Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126 
... 

现在,我创建了一个非常简单的控制台命令调用DP:试验,得出下列处理功能:

/** 
* Execute the console command. 
* 
* @return mixed 
*/ 
public function handle() 
{ 
    generate error here 
} 

php artisan dp:test的输出是:

[Symfony\Component\Debug\Exception\FatalErrorException] 
syntax error, unexpected 'error' (T_STRING)  

php artisan -v dp:test的输出是一样的。 php artisan -vvv dp:test的输出是一样的。

日志文件会显示异常跟踪,所以不知何故应该可以在cli中显示它。我甚至没有看到错误发生的地方的文件名和字符串......我该如何处理这个问题?

在此先感谢!

编辑:

被挖得更深一点。如果我在命令中使用这样的:

public function handle() 
{ 
    throw new \Exception("test exception"); 
} 

,我发出命令php artisan -v dp:test,误差跟踪打印。由于PHP错误引发异常时,跟踪只能打印。在Illuminate/Foundation/Bootstrap/HandleExceptions.php方法bootstrap PHP错误转换为例外。发生这种情况时会引发异常,但打印时会忽略-v。这非常不方便,因为它使得调试CLI应用程序变得困难。

我认为解决方案可以在vendor/symfony/console/Application.php,方法renderException中找到。

我打算以后进一步挖掘,除非别人可以:-)

回答

16

我发现原因,-v被忽略:

Illuminate/Foundation/Bootstrap/HandleExceptions.php,该renderForConsole梅索德实例化ConsoleOutput对象,使用默认设置,不考虑级别设置用户问:

protected function renderForConsole($e) 
{ 
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e); 
} 

出于这个原因,无论-v -vv或-vvv被设置,在vendor/symfony/console/Application.php中的始终低于OutputInterface::VERBOSITY_VERBOSE,因此,不会打印堆栈跟踪。

我可能会在github上为此启动一个问题,因为如果用户设置-v,我认为在CLI中显示错误会更方便。

+3

使用Laravel 5.3,它似乎工作。不知道-v,现在就做。谢谢。 –

-1

比我快一点解决办法,如果你看一下Illuminate\Console\Command类,你会看到错误字符串写入函数的定义控制台:

/** 
* Write a string as error output. 
* 
* @param string $string 
* @return void 
*/ 
public function error($string) 
{ 
    $this->output->writeln("<error>$string</error>"); 
} 

既然你看到它只写了错误字符串,你可以玩它只是一点点,以实现你想要的。您可以根据需要获取函数回调跟踪并向后输出尽可能多的行和文件。只需创建一个扩展命令类,重写功能,使您的所有命令继承该命令类:

/** 
* Write a string as error output. 
* 
* @param string $string 
* @return void 
*/ 
public function error($string) 
{ 
    $this->output->writeln("<error>$string</error>"); 
    $trace = debug_backtrace(); 
    foreach ($trace as $t) 
    { 
     $this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']); 
    } 

} 
+0

感谢您的回答,但这不能回答我的问题。这个'error'函数就像'info','debug'等一样使用。它不用于打印异常。 – Dirk

0

您可以设置冗长你会通过添加以下语句使用喜欢的任何级别:

use Symfony\Component\Console\Output\OutputInterface; 

,然后加给你的处理函数的顶部:

$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); 

见symfony控制台的文档在这里http://symfony.com/doc/current/console/verbosity.html 欲了解更多信息。

相关问题