When a sub command fail, display error message

We often got issue with message “The command "doctrine:database:create" terminated with an error code: 1.”.

Using the `BufferedOutput` we can store the output and only display it if an error occurs.
This commit is contained in:
Jeremy Benoist 2016-10-09 22:39:43 +02:00
parent 47508f004f
commit 39a19bdf47
No known key found for this signature in database
GPG key ID: BCA73962457ACC3C

View file

@ -9,7 +9,7 @@ use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question; use Symfony\Component\Console\Question\Question;
@ -97,7 +97,8 @@ class InstallCommand extends ContainerAwareCommand
try { try {
$this->getContainer()->get('doctrine')->getManager()->getConnection()->connect(); $this->getContainer()->get('doctrine')->getManager()->getConnection()->connect();
} catch (\Exception $e) { } catch (\Exception $e) {
if (false === strpos($e->getMessage(), 'Unknown database')) { if (false === strpos($e->getMessage(), 'Unknown database')
&& false === strpos($e->getMessage(), 'database "'.$this->getContainer()->getParameter('database_name').'" does not exist')) {
$fulfilled = false; $fulfilled = false;
$status = '<error>ERROR!</error>'; $status = '<error>ERROR!</error>';
$help = 'Can\'t connect to the database: '.$e->getMessage(); $help = 'Can\'t connect to the database: '.$e->getMessage();
@ -420,16 +421,18 @@ class InstallCommand extends ContainerAwareCommand
} }
$this->getApplication()->setAutoExit(false); $this->getApplication()->setAutoExit(false);
$exitCode = $this->getApplication()->run(new ArrayInput($parameters), new NullOutput());
$output = new BufferedOutput();
$exitCode = $this->getApplication()->run(new ArrayInput($parameters), $output);
if (0 !== $exitCode) { if (0 !== $exitCode) {
$this->getApplication()->setAutoExit(true); $this->getApplication()->setAutoExit(true);
$errorMessage = sprintf('The command "%s" terminated with an error code: %u.', $command, $exitCode); $this->defaultOutput->writeln('');
$this->defaultOutput->writeln("<error>$errorMessage</error>"); $this->defaultOutput->writeln('<error>The command "'.$command.'" generates some errors: </error>');
$exception = new \Exception($errorMessage, $exitCode); $this->defaultOutput->writeln($output->fetch());
throw $exception; die();
} }
// PDO does not always close the connection after Doctrine commands. // PDO does not always close the connection after Doctrine commands.