addOption( 'configuration', null, InputOption::VALUE_REQUIRED, 'The path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]', ); $this->addOption( 'em', null, InputOption::VALUE_REQUIRED, 'The name of the entity manager to use.', ); $this->addOption( 'conn', null, InputOption::VALUE_REQUIRED, 'The name of the connection to use.', ); if ($this->dependencyFactory !== null) { return; } $this->addOption( 'db-configuration', null, InputOption::VALUE_REQUIRED, 'The path to a database connection configuration file.', 'migrations-db.php', ); } protected function initialize(InputInterface $input, OutputInterface $output): void { $this->io = new SymfonyStyle($input, $output); $configurationParameter = $input->getOption('configuration'); if ($this->dependencyFactory === null) { $configurationLoader = new ConfigurationFileWithFallback( is_string($configurationParameter) ? $configurationParameter : null, ); $connectionLoader = new ConfigurationFile($input->getOption('db-configuration')); $this->dependencyFactory = DependencyFactory::fromConnection($configurationLoader, $connectionLoader); } elseif (is_string($configurationParameter)) { $configurationLoader = new ConfigurationFileWithFallback($configurationParameter); $this->dependencyFactory->setConfigurationLoader($configurationLoader); } $dependencyFactory = $this->dependencyFactory; $this->setNamedEmOrConnection($input); if ($dependencyFactory->isFrozen()) { return; } $logger = new ConsoleLogger($output, [ LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, LogLevel::NOTICE => OutputInterface::VERBOSITY_NORMAL, LogLevel::INFO => OutputInterface::VERBOSITY_VERBOSE, LogLevel::DEBUG => OutputInterface::VERBOSITY_VERY_VERBOSE, ]); $dependencyFactory->setService(LoggerInterface::class, $logger); $dependencyFactory->freeze(); } protected function getDependencyFactory(): DependencyFactory { if ($this->dependencyFactory === null) { throw DependenciesNotSatisfied::new(); } return $this->dependencyFactory; } protected function canExecute(string $question, InputInterface $input): bool { return ! $input->isInteractive() || $this->io->confirm($question); } private function setNamedEmOrConnection(InputInterface $input): void { assert($this->dependencyFactory !== null); $emName = $input->getOption('em'); $connName = $input->getOption('conn'); if ($emName !== null && $connName !== null) { throw new InvalidOptionUsage('You can specify only one of the --em and --conn options.'); } if ($this->dependencyFactory->hasEntityManager() && $emName !== null) { $this->dependencyFactory->getConfiguration()->setEntityManagerName($emName); return; } if ($connName !== null) { $this->dependencyFactory->getConfiguration()->setConnectionName($connName); return; } } final protected function getNamespace(InputInterface $input, OutputInterface $output): string { $configuration = $this->getDependencyFactory()->getConfiguration(); $namespace = $input->getOption('namespace'); if ($namespace === '') { $namespace = null; } $dirs = $configuration->getMigrationDirectories(); if ($namespace === null && count($dirs) === 1) { $namespace = key($dirs); } elseif ($namespace === null && count($dirs) > 1) { $helper = $this->getHelper('question'); $question = new ChoiceQuestion( 'Please choose a namespace (defaults to the first one)', array_keys($dirs), 0, ); $namespace = $helper->ask($input, $output, $question); $this->io->text(sprintf('You have selected the "%s" namespace', $namespace)); } if (! isset($dirs[$namespace])) { throw new Exception(sprintf('Path not defined for the namespace "%s"', $namespace)); } assert(is_string($namespace)); return $namespace; } }