2015-06-14 3 views
22

Sto usando Laravel 5.1 per creare un'applicazione basata su console. Durante lo sviluppo vorrei visualizzare la traccia di eccezione quando si verifica un errore. Tuttavia, anche se utilizzo l'opzione -v -vv o -vvv in php artisan, non viene visualizzata alcuna traccia di eccezione per i miei comandi personalizzati. Ho impostato APP_DEBUG=true nel mio .env, ancora nessuna traccia di eccezioni.Come posso visualizzare la traccia Exception nel comando della console di laravel?

uscita di php artisan some:unknowncommand è:

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

uscita di 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 
... 

Ora, ho creato un comando della console molto semplice chiamato dp: prova, con la seguente funzione manico:

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

L'output di php artisan dp:test è:

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

L'output di php artisan -v dp:test è uguale. L'uscita di php artisan -vvv dp:test è la stessa.

Il file di registro DOES mostra la traccia di eccezione, quindi in qualche modo dovrebbe essere possibile visualizzarlo in cli. Non vedo nemmeno il nome del file e il lino dove si verifica l'errore ... Come posso prendermi cura di questo?

Grazie in anticipo!

EDIT:

viene estratto un po 'più. Nel caso in cui io uso questo nel mio comando:

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

e lanciare il comando php artisan -v dp:test, la Traccia di errore viene stampato. La traccia non viene stampata solo quando viene generata un'eccezione a causa di un errore PHP. Nel metodo Illuminate/Foundation/Bootstrap/HandleExceptions.php, gli errori di PHP bootstrap vengono convertiti in Eccezioni. Quando si verifica ciò, viene generata un'eccezione, ma il -v viene in qualche modo ignorato durante la stampa. Questo è molto scomodo perché rende difficile il debug delle app CLI.

Penso che la soluzione possa essere trovata in vendor/symfony/console/Application.php, metodo renderException.

ho intenzione di scavare ulteriormente in seguito, a meno che qualcun altro può indicare la soluzione più veloce di me :-)

risposta

16

ho trovato motivo per cui -v viene ignorato:

nel Illuminate/Foundation/Bootstrap/HandleExceptions.php, la methode renderForConsole un'istanza di un ConsoleOutput oggetto, con le impostazioni predefinite, non prendendo in considerazione il livello di dettaglio delle impostazioni l'utente ha chiesto:

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

per questo motivo, qualunque sia -v -vv o vvv è impostato, il $output->getVerbosity() in vendor/symfony/console/Application.php è sempre inferiore a OutputInterface::VERBOSITY_VERBOSE, per questo motivo, la traccia dello stack non viene stampata.

Probabilmente ho iniziato un problema su github per questo, perché penso che sia molto più comodo se gli errori vengono mostrati nella CLI se l'utente imposta -v.

+3

Utilizzo di Laravel 5.3 e sembra funzionare. Non avevo idea di -v e adesso. Grazie. –

-1

Se si guarda al Illuminate\Console\Command classe si vedrà la definizione della funzione che scrive la stringa di errore per la console:

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

Ora che si vede scrive solo la stringa di errore, si può giocare solo un po 'con esso per ottenere quello che vuoi. È possibile ottenere la funzione richiamare la traccia ed emettere quante linee e file all'indietro come si desidera.Basta creare classe che estende il comando, ignorare la funzione e rendere tutti i comandi di ereditare quella classe di 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']); 
    } 

} 
+0

Grazie per la risposta, ma questo non risponde alla mia domanda. Questa funzione 'error' è pensata per essere usata come' info', 'debug' ecc. Non è usata per la stampa di eccezioni. – Dirk

0

È possibile impostare il livello di dettaglio a qualunque livello desideri aggiungendo la seguente dichiarazione uso:

use Symfony\Component\Console\Output\OutputInterface; 

E poi aggiungere questo alla parte superiore della vostra funzione di maniglia:

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

See la documentazione per console symfony qui http://symfony.com/doc/current/console/verbosity.html per ulteriori informazioni.