* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\Console; use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Debug\Exception\FatalThrowableError; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\Console\Application as BaseApplication; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\HttpKernel\Bundle\Bundle; /** * Application. * * @author Fabien Potencier */ class Application extends BaseApplication { private $kernel; private $commandsRegistered = false; private $registrationErrors = array(); /** * Constructor. * * @param KernelInterface $kernel A KernelInterface instance */ public function __construct(KernelInterface $kernel) { $this->kernel = $kernel; parent::__construct('Symfony', Kernel::VERSION); $this->getDefinition()->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The environment name', $kernel->getEnvironment())); $this->getDefinition()->addOption(new InputOption('--no-debug', null, InputOption::VALUE_NONE, 'Switches off debug mode')); } /** * Gets the Kernel associated with this Console. * * @return KernelInterface A KernelInterface instance */ public function getKernel() { return $this->kernel; } /** * Runs the current application. * * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * * @return int 0 if everything went fine, or an error code */ public function doRun(InputInterface $input, OutputInterface $output) { $this->kernel->boot(); $this->setDispatcher($this->kernel->getContainer()->get('event_dispatcher')); if ($this->registrationErrors) { $this->renderRegistrationErrors($input, $output); } return parent::doRun($input, $output); } /** * {@inheritdoc} */ protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) { if ($this->registrationErrors) { $this->renderRegistrationErrors($input, $output); } return parent::doRunCommand($command, $input, $output); } /** * {@inheritdoc} */ public function find($name) { $this->registerCommands(); return parent::find($name); } /** * {@inheritdoc} */ public function get($name) { $this->registerCommands(); $command = parent::get($name); if ($command instanceof ContainerAwareInterface) { $command->setContainer($this->kernel->getContainer()); } return $command; } /** * {@inheritdoc} */ public function all($namespace = null) { $this->registerCommands(); return parent::all($namespace); } /** * {@inheritdoc} */ public function getLongVersion() { return parent::getLongVersion().sprintf(' (kernel: %s, env: %s, debug: %s)', $this->kernel->getName(), $this->kernel->getEnvironment(), $this->kernel->isDebug() ? 'true' : 'false'); } public function add(Command $command) { $this->registerCommands(); return parent::add($command); } protected function registerCommands() { if ($this->commandsRegistered) { return; } $this->commandsRegistered = true; $this->kernel->boot(); $container = $this->kernel->getContainer(); foreach ($this->kernel->getBundles() as $bundle) { if ($bundle instanceof Bundle) { try { $bundle->registerCommands($this); } catch (\Exception $e) { $this->registrationErrors[] = $e; } catch (\Throwable $e) { $this->registrationErrors[] = new FatalThrowableError($e); } } } if ($container->has('console.command_loader')) { $this->setCommandLoader($container->get('console.command_loader')); } if ($container->hasParameter('console.command.ids')) { foreach ($container->getParameter('console.command.ids') as $id) { if (false !== $id) { try { $this->add($container->get($id)); } catch (\Exception $e) { $this->registrationErrors[] = $e; } catch (\Throwable $e) { $this->registrationErrors[] = new FatalThrowableError($e); } } } } } private function renderRegistrationErrors(InputInterface $input, OutputInterface $output) { if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } (new SymfonyStyle($input, $output))->warning('Some commands could not be registered.'); foreach ($this->registrationErrors as $error) { $this->doRenderException($error, $output); } $this->registrationErrors = array(); } }