ver tinker rutas from create commands comandos php exception laravel-5 console

php - tinker - ¿Cómo puedo visualizar la traza de excepción en el comando laravel console?



laravel tinker commands (3)

Encontré la razón por la cual -v es ignorada:

en Illuminate/Foundation/Bootstrap/HandleExceptions.php , el renderForConsole una instancia de un objeto ConsoleOutput , con la configuración predeterminada, sin tener en cuenta la configuración de verbosidad que el usuario solicitó:

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

Por esta razón, cualquiera que sea -v -vv o -vvv está configurado, el $output->getVerbosity() en vendor/symfony/console/Application.php siempre es menor que OutputInterface::VERBOSITY_VERBOSE , por esa razón, el seguimiento de la pila es no impreso

Probablemente empiece un problema en github para esto, porque creo que es mucho más conveniente si se muestran errores en CLI si el usuario establece -v.

Estoy usando Laravel 5.1 para crear una aplicación basada en consola. Durante el desarrollo, me gustaría mostrar el rastreo de excepción cuando ocurre un error. Sin embargo, incluso si uso la opción -v -vv o -vvv en php artisan , no obtengo un seguimiento de excepción para mis comandos personalizados. Establecí APP_DEBUG=true en mi .env , aún no hay una excepción de rastreo.

Salida de php artisan some:unknowncommand es:

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

Salida de php artisan -v some:unknowncommand es:

[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 ...

Ahora, creé un comando de consola muy simple llamado dp: test, con la siguiente función de manejo:

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

Salida de php artisan dp:test es:

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

La salida de php artisan -v dp:test es la misma. La salida de php artisan -vvv dp:test es la misma.

El archivo de registro muestra la traza de excepción, por lo que de alguna manera debería ser posible mostrarla en cli. Ni siquiera veo el nombre del archivo y el lienzo donde ocurre el error ... ¿Cómo puedo solucionar esto?

¡Gracias por adelantado!

EDITAR:

Se excava un poco más. En caso de que use esto en mi Comando:

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

y emite el comando php artisan -v dp:test , se imprime el error de traza. La traza solo no se imprime cuando se lanza la excepción debido a un error de PHP. En el método Illuminate/Foundation/Bootstrap/HandleExceptions.php errores de bootstrap PHP se convierten en Excepciones. Cuando esto ocurre, se lanza una excepción, pero el -v se ignora de alguna manera al imprimir. Esto es muy inconveniente porque dificulta la depuración de aplicaciones CLI.

Creo que la solución se puede encontrar en vendor/symfony/console/Application.php , método renderException .

Voy a profundizar más adelante, a menos que alguien más pueda señalar la solución más rápido que yo :-)


Puede establecer la verbosidad al nivel que desee agregando la siguiente declaración de uso:

use Symfony/Component/Console/Output/OutputInterface;

Y luego agregar esto a la parte superior de la función de manejo:

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

Consulte la documentación de la consola de Symfony aquí http://symfony.com/doc/current/console/verbosity.html para obtener más información.


Si observa la clase Illuminate/Console/Command , verá la definición de la función que escribe la cadena de error en la consola:

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

Ahora que lo ves solo escribe la cadena de error, puedes jugar un poco con ella para lograr lo que quieres. Puede obtener la función call back trace y generar tantas líneas y archivos al revés como desee. Simplemente cree la clase que extiende el comando, anule la función y haga que todos sus comandos hereden esa clase de comando:

/** * 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'']); } }