web-dev-qa-db-ja.com

laravelコンソールコマンドで例外トレースを表示するにはどうすればよいですか?

Laravel 5.1を使用してコンソールベースのアプリケーションを作成しています。開発中、エラーが発生したときに例外トレースを表示したいのですが、-v -vvまたは-vvvを使用してもオプションphp artisanで、カスタムコマンドの例外トレースを取得できません。APP_DEBUG=true.envを設定しましたが、例外トレースはありません。

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:testという非常に単純なコンソールコマンドを作成し、次のハンドル関数を使用しました。

/**
 * 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を発行すると、エラートレースIS印刷されます。PHPにより例外がスローされた場合にのみ、トレースが印刷されません。エラー。Illuminate/Foundation/Bootstrap/HandleExceptions.phpメソッドでbootstrap PHPエラーが例外に変換されます。これが発生すると、例外がスローされますが、印刷時に-vは無視されます。 CLIアプリのデバッグが困難になるため、これは非常に不便です。

解決策はvendor/symfony/console/Application.php、メソッドrenderExceptionにあると思います。

他の誰かが私より速く解決策を指摘できない限り、私は後でさらに掘り下げるつもりです:-)

25
Dirk

-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_の$output->getVerbosity()は常に_OutputInterface::VERBOSITY_VERBOSE_よりも低く、そのためスタックトレースは出力されません。

ユーザーが-vを設定した場合にエラーがCLIに表示される方がはるかに便利だと思うので、おそらく私はgithubでこの問題を開始します。

21
Dirk

次のuseステートメントを追加することで、冗長性を任意のレベルに設定できます。

use Symfony\Component\Console\Output\OutputInterface;

次に、これをハンドル関数の先頭に追加します。

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

詳細については、symfonyコンソールのドキュメント http://symfony.com/doc/current/console/verbosity.html を参照してください。

1
wheelmaker