container = $container; parent::__construct($name, $version); $this->addOptions(); } /** * @return TranslatorManagerInterface */ public function getTranslator() { if ($this->container) { return $this->container->get('console.translator_manager'); } return null; } /** * @param $key string * * @return string */ public function trans($key) { if ($this->getTranslator()) { return $this->getTranslator()->trans($key); } return null; } /** * {@inheritdoc} */ public function doRun(InputInterface $input, OutputInterface $output) { $io = new DrupalStyle($input, $output); if ($commandName = $this->getCommandName($input)) { $this->commandName = $commandName; } $this->registerEvents(); $this->registerExtendCommands(); $this->registerCommandsFromAutoWireConfiguration(); $this->registerChainCommands(); /** * @var ConfigurationManager $configurationManager */ $configurationManager = $this->container ->get('console.configuration_manager'); if ($commandName && !$this->has($commandName)) { $io->error( sprintf( $this->trans('application.errors.invalid-command'), $this->commandName ) ); return 1; } $code = parent::doRun( $input, $output ); if ($this->commandName != 'init' && $configurationManager->getMissingConfigurationFiles()) { $io->warning($this->trans('application.site.errors.missing-config-file')); $io->listing($configurationManager->getMissingConfigurationFiles()); $io->commentBlock( $this->trans('application.site.errors.missing-config-file-command') ); } if ($this->getCommandName($input) == 'list' && $this->container->hasParameter('console.warning')) { $io->warning( $this->trans($this->container->getParameter('console.warning')) ); } return $code; } /** * registerEvents */ private function registerEvents() { $dispatcher = new EventDispatcher(); /* @todo Register listeners as services */ $dispatcher->addSubscriber( new ValidateExecutionListener( $this->container->get('console.translator_manager'), $this->container->get('console.configuration_manager') ) ); $dispatcher->addSubscriber( new ShowWelcomeMessageListener( $this->container->get('console.translator_manager') ) ); $dispatcher->addSubscriber( new DefaultValueEventListener( $this->container->get('console.configuration_manager') ) ); $dispatcher->addSubscriber( new ShowTipsListener( $this->container->get('console.translator_manager') ) ); $dispatcher->addSubscriber( new CallCommandListener( $this->container->get('console.chain_queue') ) ); $dispatcher->addSubscriber( new ShowGeneratedFilesListener( $this->container->get('console.file_queue'), $this->container->get('console.show_file') ) ); $dispatcher->addSubscriber( new ShowGenerateInlineListener( $this->container->get('console.translator_manager') ) ); $dispatcher->addSubscriber( new ShowGenerateChainListener( $this->container->get('console.translator_manager') ) ); $this->setDispatcher($dispatcher); } /** * addOptions */ private function addOptions() { $this->getDefinition()->addOption( new InputOption( '--env', '-e', InputOption::VALUE_OPTIONAL, $this->trans('application.options.env'), 'prod' ) ); $this->getDefinition()->addOption( new InputOption( '--root', null, InputOption::VALUE_OPTIONAL, $this->trans('application.options.root') ) ); $this->getDefinition()->addOption( new InputOption( '--debug', null, InputOption::VALUE_NONE, $this->trans('application.options.debug') ) ); $this->getDefinition()->addOption( new InputOption( '--learning', null, InputOption::VALUE_NONE, $this->trans('application.options.learning') ) ); $this->getDefinition()->addOption( new InputOption( '--generate-chain', '-c', InputOption::VALUE_NONE, $this->trans('application.options.generate-chain') ) ); $this->getDefinition()->addOption( new InputOption( '--generate-inline', '-i', InputOption::VALUE_NONE, $this->trans('application.options.generate-inline') ) ); $this->getDefinition()->addOption( new InputOption( '--generate-doc', '-d', InputOption::VALUE_NONE, $this->trans('application.options.generate-doc') ) ); $this->getDefinition()->addOption( new InputOption( '--target', '-t', InputOption::VALUE_OPTIONAL, $this->trans('application.options.target') ) ); $this->getDefinition()->addOption( new InputOption( '--uri', '-l', InputOption::VALUE_REQUIRED, $this->trans('application.options.uri') ) ); $this->getDefinition()->addOption( new InputOption( '--yes', '-y', InputOption::VALUE_NONE, $this->trans('application.options.yes') ) ); } /** * registerExtendCommands */ private function registerExtendCommands() { $this->container->get('console.configuration_manager') ->loadExtendConfiguration(); } /** * registerCommandsFromAutoWireConfiguration */ private function registerCommandsFromAutoWireConfiguration() { $configuration = $this->container->get('console.configuration_manager') ->getConfiguration(); $autoWireForcedCommands = $configuration ->get('application.autowire.commands.forced'); if(!is_array($autoWireForcedCommands)){ return; } foreach ($autoWireForcedCommands as $autoWireForcedCommand) { try { if (!$autoWireForcedCommand['class']) { continue; } $reflectionClass = new \ReflectionClass( $autoWireForcedCommand['class'] ); $arguments = []; if (array_key_exists('arguments', $autoWireForcedCommand)) { foreach ($autoWireForcedCommand['arguments'] as $argument) { $argument = substr($argument, 1); $arguments[] = $this->container->get($argument); } } $command = $reflectionClass->newInstanceArgs($arguments); if (method_exists($command, 'setTranslator')) { $command->setTranslator( $this->container->get('console.translator_manager') ); } if (method_exists($command, 'setContainer')) { $command->setContainer( $this->container->get('service_container') ); } $this->add($command); } catch (\Exception $e) { echo $e->getMessage() . PHP_EOL; continue; } } $autoWireNameCommand = $configuration->get( sprintf( 'application.autowire.commands.name.%s', $this->commandName ) ); if ($autoWireNameCommand) { try { $arguments = []; if (array_key_exists('arguments', $autoWireNameCommand)) { foreach ($autoWireNameCommand['arguments'] as $argument) { $argument = substr($argument, 1); $arguments[] = $this->container->get($argument); } } $reflectionClass = new \ReflectionClass( $autoWireNameCommand['class'] ); $command = $reflectionClass->newInstanceArgs($arguments); if (method_exists($command, 'setTranslator')) { $command->setTranslator( $this->container->get('console.translator_manager') ); } if (method_exists($command, 'setContainer')) { $command->setContainer( $this->container->get('service_container') ); } $this->add($command); } catch (\Exception $e) { echo $e->getMessage() . PHP_EOL; } } } /** * registerChainCommands */ public function registerChainCommands() { /** * @var ChainDiscovery $chainDiscovery */ $chainDiscovery = $this->container->get('console.chain_discovery'); $chainCommands = $chainDiscovery->getChainCommands(); foreach ($chainCommands as $name => $chainCommand) { try { $file = $chainCommand['file']; $description = $chainCommand['description']; $command = new ChainCustomCommand($name, $description, $file); $this->add($command); } catch (\Exception $e) { echo $e->getMessage() . PHP_EOL; } } } /** * Finds a command by name or alias. * * @param string $name A command name or a command alias * * @return mixed A Command instance * * Override parent find method to avoid name collisions with automatically * generated command abbreviations. * Command name validation was previously done at doRun method. */ public function find($name) { return $this->get($name); } }