I’m using Laravel 5.1 to create a console based application. During development I would like to display the exception trace when an error occurs. However, even if I use -v -vv or -vvv option in php artisan
, I don’t get an exception trace for my custom commands. I set APP_DEBUG=true
in my .env
, still no exception trace.
Output of php artisan some:unknowncommand
is:
[InvalidArgumentException] There are no commands defined in the "some" namespace.
Output of php artisan -v some:unknowncommand
is:
[InvalidArgumentException] There are no commands defined in the "some" namespace. Exception trace: () at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501 SymfonyComponentConsoleApplication->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535 SymfonyComponentConsoleApplication->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192 SymfonyComponentConsoleApplication->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126 ...
Now, I created a very simple console command called dp:test, with following handle function:
/** * Execute the console command. * * @return mixed */ public function handle() { generate error here }
Output of php artisan dp:test
is:
[SymfonyComponentDebugExceptionFatalErrorException] syntax error, unexpected 'error' (T_STRING)
Output of php artisan -v dp:test
is the same.
Output of php artisan -vvv dp:test
is the same.
The log file DOES show the exception trace, so somehow it should be possible to display it in cli. I don’t even see the filename and linenumer where the error occurs… How can I take care of this?
Thanks in advance!
EDIT:
Is digged a bit further. In case I use this in my Command:
public function handle() { throw new Exception("test exception"); }
and I issue the command php artisan -v dp:test
, the error trace IS printed. The trace is only not printed when the exception is thrown due to a PHP error. In Illuminate/Foundation/Bootstrap/HandleExceptions.php
method bootstrap
PHP errors are converted to Exceptions. When this occurs, an exception is thrown, but the -v is somehow ignored when printing. This is very inconvenient because it makes debugging CLI apps hard.
I think the solution can be found in vendor/symfony/console/Application.php
, method renderException
.
I’m going to dig further later, unless someone else can point the solution faster than me 🙂
Advertisement
Answer
I found reason why -v is ignored:
in Illuminate/Foundation/Bootstrap/HandleExceptions.php
, the renderForConsole
method instantiates a ConsoleOutput
object, with default settings, not taking into account the verbosity settings the user asked for:
protected function renderForConsole($e) { $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e); }
For this reason, whatever -v -vv or -vvv is set, the $output->getVerbosity()
in vendor/symfony/console/Application.php
is always lower than OutputInterface::VERBOSITY_VERBOSE
, for that reason, the stack trace is not printed.
I probably start an issue on github for this, because I think it’s much more convenient if errors are shown in CLI if user sets -v.