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
にあると思います。
他の誰かが私より速く解決策を指摘できない限り、私は後でさらに掘り下げるつもりです:-)
-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でこの問題を開始します。
次のuseステートメントを追加することで、冗長性を任意のレベルに設定できます。
use Symfony\Component\Console\Output\OutputInterface;
次に、これをハンドル関数の先頭に追加します。
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
詳細については、symfonyコンソールのドキュメント http://symfony.com/doc/current/console/verbosity.html を参照してください。