From 883c4913bcd20e9b1dee26b2a0e7881007a075e0 Mon Sep 17 00:00:00 2001 From: watari Date: Thu, 28 Jun 2018 10:25:18 +0300 Subject: [PATCH 1/6] Updated logic for generate command. Introduced interfaces for Configuration ConfigurationBuilder --- Command/BundleAwareTrait.php | 46 ++++++++++++++++++ Command/CommandHelper.php | 64 +++++++++++++++++++++----- Command/MigrationsExecuteCommand.php | 2 +- Command/MigrationsGenerateCommand.php | 25 +++++++--- Command/MigrationsMigrateCommand.php | 2 +- Command/MigrationsStatusCommand.php | 2 +- Command/MigrationsVersionCommand.php | 2 +- Configuration/Configuration.php | 37 +++++++++++++++ Configuration/ConfigurationBuilder.php | 33 +++++++++++++ DependencyInjection/Configuration.php | 9 ++++ 10 files changed, 201 insertions(+), 21 deletions(-) create mode 100644 Command/BundleAwareTrait.php create mode 100644 Configuration/Configuration.php create mode 100644 Configuration/ConfigurationBuilder.php diff --git a/Command/BundleAwareTrait.php b/Command/BundleAwareTrait.php new file mode 100644 index 0000000..ad0806f --- /dev/null +++ b/Command/BundleAwareTrait.php @@ -0,0 +1,46 @@ + + */ +trait BundleAwareTrait +{ + /** + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface $output + * + * @return \AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration + */ + protected function getMigrationConfiguration(InputInterface $input, OutputInterface $output): ConfigurationInterface + { + $configuration = parent::getMigrationConfiguration($input, $output); + + if ($input->hasOption('bundle')) { + $configuration->setMigrationsBundleAlias($input->getOption('bundle')); + } + + return $configuration; + } + + + /** + * Create instance of configuration builder for command. + * + * @return ConfigurationBuilderInterface + */ + protected function getConfigurationBuilder(): ConfigurationBuilderInterface + { + return ConfigurationBuilder::create(); + } +} diff --git a/Command/CommandHelper.php b/Command/CommandHelper.php index 5ef27a8..438aea0 100644 --- a/Command/CommandHelper.php +++ b/Command/CommandHelper.php @@ -11,11 +11,12 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; -use AntiMattr\MongoDB\Migrations\Configuration\Configuration; +use AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration; use Doctrine\ODM\MongoDB\Tools\Console\Helper\DocumentManagerHelper; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Symfony\Component\HttpKernel\Bundle\Bundle; /** * @author Matthew Fitzgerald @@ -30,18 +31,18 @@ final class CommandHelper */ public static function configureMigrations(ContainerInterface $container, Configuration $configuration) { - $dir = $container->getParameter('mongo_db_migrations.dir_name'); - if (!file_exists($dir)) { - mkdir($dir, 0777, true); + $params = self::getConfigParams($container, $configuration); + if (!file_exists($params['dir_name'])) { + mkdir($params['dir_name'], 0777, true); } - $configuration->setMigrationsCollectionName($container->getParameter('mongo_db_migrations.collection_name')); - $configuration->setMigrationsDatabaseName($container->getParameter('mongo_db_migrations.database_name')); - $configuration->setMigrationsDirectory($dir); - $configuration->setMigrationsNamespace($container->getParameter('mongo_db_migrations.namespace')); - $configuration->setName($container->getParameter('mongo_db_migrations.name')); - $configuration->registerMigrationsFromDirectory($dir); - $configuration->setMigrationsScriptDirectory($container->getParameter('mongo_db_migrations.script_dir_name')); + $configuration->setMigrationsCollectionName($params['collection_name']); + $configuration->setMigrationsDatabaseName($params['database_name']); + $configuration->setMigrationsDirectory($params['dir_name']); + $configuration->setMigrationsNamespace($params['namespace']); + $configuration->setName($params['name']); + $configuration->registerMigrationsFromDirectory($params['dir_name']); + $configuration->setMigrationsScriptDirectory($params['script_dir_name']); self::injectContainerToMigrations($container, $configuration->getMigrations()); } @@ -62,6 +63,47 @@ public static function setApplicationDocumentManager(Application $application, $ $helperSet->set(new DocumentManagerHelper($dm), 'dm'); } + protected static function getConfigParams(ContainerInterface $container, Configuration $configuration): array + { + $params = [ + 'collection_name' => $container->getParameter('mongo_db_migrations.collection_name'), + 'database_name' => $container->getParameter('mongo_db_migrations.database_name'), + 'script_dir_name' => $container->getParameter('mongo_db_migrations.script_dir_name'), + ]; + + if (!empty($configuration->getMigrationsBundleAlias())) { + $bundleAlias = $configuration->getMigrationsBundleAlias(); + $bundles = $container->getParameter('mongo_db_migrations.bundles'); + if (empty($bundles[$bundleAlias])) { + throw new \RuntimeException("Bundle with alias {$bundleAlias} has no registered migration configs"); + } + $bundleConfig = $bundles[$bundleAlias]; + /** @var Bundle[] $bundles */ + $bundles = $container->get('kernel')->getBundles(); + $targetBundle = null; + foreach ($bundles as $bundle) { + $containerExtension = $bundle->getContainerExtension(); + if(null !== $containerExtension && $containerExtension->getAlias() === $bundleAlias) { + $targetBundle = $bundle; + break; + } + } + if (null === $targetBundle) { + throw new \RuntimeException("Bundle with alias {$bundleAlias} is not found"); + } + + $params['namespace'] = $targetBundle->getNamespace() . '\\' . $bundleConfig['namespace']; + $params['dir_name'] = $targetBundle->getPath() . '/' . $bundleConfig['dir_name']; + $params['name'] = $bundleConfig['name']; + } else { + $params['name'] = $container->getParameter('mongo_db_migrations.name'); + $params['namespace'] = $container->getParameter('mongo_db_migrations.namespace'); + $params['dir_name'] = $container->getParameter('mongo_db_migrations.dir_name'); + } + + return $params; + } + /** * injectContainerToMigrations. * diff --git a/Command/MigrationsExecuteCommand.php b/Command/MigrationsExecuteCommand.php index 106ba19..d033cf0 100644 --- a/Command/MigrationsExecuteCommand.php +++ b/Command/MigrationsExecuteCommand.php @@ -21,7 +21,7 @@ */ class MigrationsExecuteCommand extends ExecuteCommand { - protected function configure() + protected function configure(): void { parent::configure(); diff --git a/Command/MigrationsGenerateCommand.php b/Command/MigrationsGenerateCommand.php index 8d7bf78..c9fb7c7 100644 --- a/Command/MigrationsGenerateCommand.php +++ b/Command/MigrationsGenerateCommand.php @@ -1,4 +1,5 @@ setName('mongodb:migrations:generate') - ->addOption('dm', null, InputOption::VALUE_OPTIONAL, 'The document manager to use for this command.', 'default_document_manager') - ; + $this->setName('mongodb:migrations:generate'); + $this->addOption( + 'bundle', + null, + InputOption::VALUE_OPTIONAL, + 'Alias of bundle for which migration will be generated.' + ); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); } - public function execute(InputInterface $input, OutputInterface $output) + public function execute(InputInterface $input, OutputInterface $output): void { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); diff --git a/Command/MigrationsMigrateCommand.php b/Command/MigrationsMigrateCommand.php index 66f57db..ec924d3 100644 --- a/Command/MigrationsMigrateCommand.php +++ b/Command/MigrationsMigrateCommand.php @@ -21,7 +21,7 @@ */ class MigrationsMigrateCommand extends MigrateCommand { - protected function configure() + protected function configure(): void { parent::configure(); diff --git a/Command/MigrationsStatusCommand.php b/Command/MigrationsStatusCommand.php index 67d69fc..9571ed4 100644 --- a/Command/MigrationsStatusCommand.php +++ b/Command/MigrationsStatusCommand.php @@ -21,7 +21,7 @@ */ class MigrationsStatusCommand extends StatusCommand { - protected function configure() + protected function configure(): void { parent::configure(); diff --git a/Command/MigrationsVersionCommand.php b/Command/MigrationsVersionCommand.php index ff87d0a..807cd6f 100644 --- a/Command/MigrationsVersionCommand.php +++ b/Command/MigrationsVersionCommand.php @@ -21,7 +21,7 @@ */ class MigrationsVersionCommand extends VersionCommand { - protected function configure() + protected function configure(): void { parent::configure(); diff --git a/Configuration/Configuration.php b/Configuration/Configuration.php new file mode 100644 index 0000000..60cd4cc --- /dev/null +++ b/Configuration/Configuration.php @@ -0,0 +1,37 @@ + + */ +class Configuration extends \AntiMattr\MongoDB\Migrations\Configuration\Configuration +{ + /** + * Alias of bundle for which command is running. + * + * @var string|null + */ + protected $migrationsBundleAlias; + + /** + * @return null|string + */ + public function getMigrationsBundleAlias(): ?string + { + return $this->migrationsBundleAlias; + } + + /** + * @param null|string $migrationsBundleAlias + * + * @return void + */ + public function setMigrationsBundleAlias(?string $migrationsBundleAlias): void + { + $this->migrationsBundleAlias = $migrationsBundleAlias; + } +} diff --git a/Configuration/ConfigurationBuilder.php b/Configuration/ConfigurationBuilder.php new file mode 100644 index 0000000..0323935 --- /dev/null +++ b/Configuration/ConfigurationBuilder.php @@ -0,0 +1,33 @@ + + */ +class ConfigurationBuilder extends \AntiMattr\MongoDB\Migrations\Configuration\ConfigurationBuilder +{ + + /** + * @inheritdoc + * + * @param Connection $connection + * @param OutputWriter $outputWriter + * + * @return ConfigurationInterface + */ + protected function createConfigurationInstance( + Connection $connection, + OutputWriter $outputWriter + ): ConfigurationInterface { + return new Configuration($connection, $outputWriter); + } +} diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 497dcd6..9a69f40 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -37,6 +37,15 @@ public function getConfigTreeBuilder() ->scalarNode('name')->defaultValue('Application MongoDB Migrations')->end() ->scalarNode('namespace')->defaultValue('Application\MongoDBMigrations')->cannotBeEmpty()->end() ->scalarNode('script_dir_name')->end() + ->arrayNode('bundles') + ->canBeUnset() + ->useAttributeAsKey('key') + ->prototype('array') + ->children() + ->scalarNode('defaults')->cannotBeEmpty()->defaultFalse()->end() + ->scalarNode('dir_name')->defaultValue('MongoDBMigrations')->end() + ->scalarNode('name')->defaultValue('Bundle MongoDB Migrations')->end() + ->scalarNode('namespace')->defaultValue('MongoDBMigrations')->end() ->end() ; From 2c086124a083671f6e5d14161bc7d8065e00674e Mon Sep 17 00:00:00 2001 From: watari Date: Thu, 28 Jun 2018 16:34:52 +0300 Subject: [PATCH 2/6] Updated logic for migrate command. --- Command/CommandHelper.php | 54 +++++++- Command/MigrationsMigrateCommand.php | 192 ++++++++++++++++++++++++++- Resources/config/services.xml | 1 + 3 files changed, 234 insertions(+), 13 deletions(-) diff --git a/Command/CommandHelper.php b/Command/CommandHelper.php index 438aea0..f5f703a 100644 --- a/Command/CommandHelper.php +++ b/Command/CommandHelper.php @@ -1,4 +1,5 @@ @@ -29,13 +32,22 @@ final class CommandHelper * @param ContainerInterface $container * @param Configuration $configuration */ - public static function configureMigrations(ContainerInterface $container, Configuration $configuration) + public static function configureMigrations(ContainerInterface $container, ConfigurationInterface $configuration) { $params = self::getConfigParams($container, $configuration); - if (!file_exists($params['dir_name'])) { - mkdir($params['dir_name'], 0777, true); + self::configureConfiguration($container, $params, $configuration); + } + + public static function configureConfiguration( + ContainerInterface $container, + array $params, + ConfigurationInterface $configuration + ): void { + if (!\file_exists($params['dir_name'])) { + \mkdir($params['dir_name'], 0777, true); } + $configuration->setPrefix($params['prefix']); $configuration->setMigrationsCollectionName($params['collection_name']); $configuration->setMigrationsDatabaseName($params['database_name']); $configuration->setMigrationsDirectory($params['dir_name']); @@ -63,7 +75,7 @@ public static function setApplicationDocumentManager(Application $application, $ $helperSet->set(new DocumentManagerHelper($dm), 'dm'); } - protected static function getConfigParams(ContainerInterface $container, Configuration $configuration): array + protected static function getConfigParams(ContainerInterface $container, ConfigurationInterface $configuration): array { $params = [ 'collection_name' => $container->getParameter('mongo_db_migrations.collection_name'), @@ -71,7 +83,7 @@ protected static function getConfigParams(ContainerInterface $container, Configu 'script_dir_name' => $container->getParameter('mongo_db_migrations.script_dir_name'), ]; - if (!empty($configuration->getMigrationsBundleAlias())) { + if ($configuration instanceof Configuration && !empty($configuration->getMigrationsBundleAlias())) { $bundleAlias = $configuration->getMigrationsBundleAlias(); $bundles = $container->getParameter('mongo_db_migrations.bundles'); if (empty($bundles[$bundleAlias])) { @@ -83,7 +95,7 @@ protected static function getConfigParams(ContainerInterface $container, Configu $targetBundle = null; foreach ($bundles as $bundle) { $containerExtension = $bundle->getContainerExtension(); - if(null !== $containerExtension && $containerExtension->getAlias() === $bundleAlias) { + if (null !== $containerExtension && $containerExtension->getAlias() === $bundleAlias) { $targetBundle = $bundle; break; } @@ -95,7 +107,9 @@ protected static function getConfigParams(ContainerInterface $container, Configu $params['namespace'] = $targetBundle->getNamespace() . '\\' . $bundleConfig['namespace']; $params['dir_name'] = $targetBundle->getPath() . '/' . $bundleConfig['dir_name']; $params['name'] = $bundleConfig['name']; + $params['prefix'] = $bundleAlias; } else { + $params['prefix'] = 'app'; $params['name'] = $container->getParameter('mongo_db_migrations.name'); $params['namespace'] = $container->getParameter('mongo_db_migrations.namespace'); $params['dir_name'] = $container->getParameter('mongo_db_migrations.dir_name'); @@ -104,6 +118,34 @@ protected static function getConfigParams(ContainerInterface $container, Configu return $params; } + public static function getConfigParamsForBundle( + ContainerInterface $container, + BundleInterface $bundle + ): array { + if ($bundle->getContainerExtension() == null) { + throw new \InvalidArgumentException( + "Bundle with name {$bundle->getName()} do not have bundle extension. Bundle alias cannot be defined." + ); + } + $bundleAlias = $bundle->getContainerExtension()->getAlias(); + $bundleConfigs = $container->getParameter('mongo_db_migrations.bundles'); + if (empty($bundleConfigs[$bundleAlias])) { + throw new \RuntimeException("Bundle with alias {$bundleAlias} has no registered migration configs"); + } + + $bundleConfig = $bundleConfigs[$bundleAlias]; + + return [ + 'collection_name' => $container->getParameter('mongo_db_migrations.collection_name'), + 'database_name' => $container->getParameter('mongo_db_migrations.database_name'), + 'script_dir_name' => $container->getParameter('mongo_db_migrations.script_dir_name'), + 'namespace' => $bundle->getNamespace() . '\\' . $bundleConfig['namespace'], + 'dir_name' => $bundle->getPath() . '/' . $bundleConfig['dir_name'], + 'name' => $bundleConfig['name'], + 'prefix' => $bundleAlias, + ]; + } + /** * injectContainerToMigrations. * diff --git a/Command/MigrationsMigrateCommand.php b/Command/MigrationsMigrateCommand.php index ec924d3..7bbd81f 100644 --- a/Command/MigrationsMigrateCommand.php +++ b/Command/MigrationsMigrateCommand.php @@ -11,33 +11,211 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; +use AntiMattr\MongoDB\Migrations\Configuration\Configuration; +use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; +use AntiMattr\MongoDB\Migrations\OutputWriter; use AntiMattr\MongoDB\Migrations\Tools\Console\Command\MigrateCommand; +use Doctrine\MongoDB\Connection; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpKernel\Bundle\Bundle; /** * @author Matthew Fitzgerald */ class MigrationsMigrateCommand extends MigrateCommand { + protected $container; + + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + protected function configure(): void { parent::configure(); - $this - ->setName('mongodb:migrations:migrate') - ->addOption('dm', null, InputOption::VALUE_OPTIONAL, 'The document manager to use for this command.', 'default_document_manager') - ; + $this->setName('mongodb:migrations:migrate'); + $this->addOption( + 'include-bundle', + null, + InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, + 'Alias of bundle which migrations should be applied.' + ); + $this->addOption( + 'include-bundles', + null, + InputOption::VALUE_NONE, + 'Indicate that all migrations should be applied.' + ); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); } public function execute(InputInterface $input, OutputInterface $output) { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); - $configuration = $this->getMigrationConfiguration($input, $output); - CommandHelper::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration); + $version = $input->getArgument('version'); + $configurations = $this->getMigrationConfigurations($input, $output); + + $isInteractive = $input->isInteractive(); + + + // warn the user if no dry run and interaction is on + if ($isInteractive) { + $question = new ConfirmationQuestion( + 'WARNING! You are about to execute a database migration that could result in data lost. Are you sure you wish to continue? (y/[n]) ', + false + ); + + $confirmation = $this->getHelper('question')->ask($input, $output, $question); + + if (!$confirmation) { + $output->writeln('Migration cancelled!'); + + return 1; + } + } + + foreach ($configurations as $configuration) { + + $migration = $this->createMigration($configuration); + $this->outputHeader($configuration, $output); + + $executedVersions = $configuration->getMigratedVersions(); + $availableVersions = $configuration->getAvailableVersions(); + $executedUnavailableVersions = array_diff($executedVersions, $availableVersions); + + if (!empty($executedUnavailableVersions)) { + $output->writeln(sprintf('WARNING! You have %s previously executed migrations in the database that are not registered migrations.', + count($executedUnavailableVersions))); + foreach ($executedUnavailableVersions as $executedUnavailableVersion) { + $output->writeln( + sprintf( + ' >> %s (%s)', + Configuration::formatVersion($executedUnavailableVersion), + $executedUnavailableVersion + ) + ); + } + + if ($isInteractive) { + $question = new ConfirmationQuestion( + 'Are you sure you wish to continue? (y/[n]) ', + false + ); + + $confirmation = $this + ->getHelper('question') + ->ask($input, $output, $question); + + if (!$confirmation) { + $output->writeln('Migration cancelled!'); + + return 1; + } + } + } + + $migration->migrate($version); + } + + return 0; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return ConfigurationInterface[] + */ + protected function getMigrationConfigurations(InputInterface $input, OutputInterface $output): array + { + $configs = [ + $this->getMigrationConfiguration($input, $output), + ]; + CommandHelper::configureMigrations($this->container, $configs[0]); + + $includeAllBundles = $input->getOption('include-bundles'); + $bundleAliasesList = $input->getOption('include-bundle'); + + if (!empty($includeAllBundles) && !empty($bundleAliasesList)) { + throw new \InvalidArgumentException( + 'Options "include-bundles" and "include-bundle" cannot be specified simultaneously.' + ); + } + + $outputWriter = new OutputWriter( + function ($message) use ($output) { + return $output->writeln($message); + } + ); + $databaseConnection = $this->getDatabaseConnection($input); + $matchedBundles = []; + + if ($includeAllBundles) { + /** @var array $registeredBundles */ + $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); + /** @var Bundle[] $appBundles */ + $appBundles = $this->container->get('kernel')->getBundles(); + + foreach ($appBundles as $bundle) { + $bundleExtension = $bundle->getContainerExtension(); + if (null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()])) { + $matchedBundles[] = $bundle; + } + } + } elseif (!empty($bundleAliasesList)) { + /** @var array $registeredBundles */ + $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); + /** @var Bundle[] $appBundles */ + $appBundles = $this->container->get('kernel')->getBundles(); + $bundleAliasesMap = \array_flip($bundleAliasesList); + foreach ($appBundles as $bundle) { + $bundleExtension = $bundle->getContainerExtension(); + if ( + null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()]) + && !empty($bundleAliasesMap[$bundleExtension->getAlias()]) + ) { + $matchedBundles[] = $bundle; + } + } + } + + foreach ($matchedBundles as $bundle) { + $configs[] = $this->createConfiguration( + $databaseConnection, + $outputWriter, + CommandHelper::getConfigParamsForBundle($this->container, $bundle) + ); + } + + return $configs; + } + + protected function createConfiguration( + Connection $connection, + OutputWriter $outputWriter, + array $params + ): ConfigurationInterface { + $configuration = $this->getConfigurationBuilder() + ->setConnection($connection) + ->setOutputWriter($outputWriter) + ->build(); + CommandHelper::configureConfiguration($this->container, $params, $configuration); - parent::execute($input, $output); + return $configuration; } } diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 6055cf4..63cbfb3 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -4,6 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> + Date: Thu, 28 Jun 2018 18:19:47 +0300 Subject: [PATCH 3/6] Updated logic for version and execute commands. Refactored CommandHelper --- Command/BundleAwareTrait.php | 47 +++++++++++++++++++-- Command/CommandHelper.php | 61 ++++++++++----------------- Command/MigrationsExecuteCommand.php | 34 ++++++++++++--- Command/MigrationsGenerateCommand.php | 16 +++++-- Command/MigrationsMigrateCommand.php | 2 +- Command/MigrationsVersionCommand.php | 36 +++++++++++++--- 6 files changed, 136 insertions(+), 60 deletions(-) diff --git a/Command/BundleAwareTrait.php b/Command/BundleAwareTrait.php index ad0806f..d30b89e 100644 --- a/Command/BundleAwareTrait.php +++ b/Command/BundleAwareTrait.php @@ -4,18 +4,32 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; use AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\ConfigurationBuilder; +use AntiMattr\MongoDB\Migrations\Configuration\Configuration; use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationBuilderInterface; use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Trait BundleAwareTrait * @package AntiMattr\Bundle\MongoDBMigrationsBundle\Command * @author Watari + * + * @property ContainerInterface $container */ trait BundleAwareTrait { + + protected $configuration; + + /** + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface $output + * + * @return \AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration + */ + /** * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output @@ -24,13 +38,38 @@ trait BundleAwareTrait */ protected function getMigrationConfiguration(InputInterface $input, OutputInterface $output): ConfigurationInterface { - $configuration = parent::getMigrationConfiguration($input, $output); + if (null === $this->configuration) { + $configuration = parent::getMigrationConfiguration($input, $output); + + $bundleAlias = $input->getOption('bundle'); + + if (Configuration::DEFAULT_PREFIX !== $bundleAlias) { + $bundle = CommandHelper::getBundleByAlias($bundleAlias, $this->container); + if (null == $bundle) { + throw new \InvalidArgumentException("Bundle is not found for specified alias {$bundleAlias}"); + } else { + $configuration = $this->getConfigurationBuilder() + ->setConnection($configuration->getConnection()) + ->setOutputWriter($configuration->getOutputWriter()) + ->build(); + CommandHelper::configureConfiguration( + $this->container, + CommandHelper::getConfigParamsForBundle($this->container, $bundle), + $configuration + ); + } + } else { + CommandHelper::configureConfiguration( + $this->container, + CommandHelper::getConfigParams($this->container), + $configuration + ); + } - if ($input->hasOption('bundle')) { - $configuration->setMigrationsBundleAlias($input->getOption('bundle')); + $this->configuration = $configuration; } - return $configuration; + return $this->configuration; } diff --git a/Command/CommandHelper.php b/Command/CommandHelper.php index f5f703a..b2febe1 100644 --- a/Command/CommandHelper.php +++ b/Command/CommandHelper.php @@ -18,7 +18,6 @@ use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface; -use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\HttpKernel\Bundle\BundleInterface; /** @@ -34,7 +33,7 @@ final class CommandHelper */ public static function configureMigrations(ContainerInterface $container, ConfigurationInterface $configuration) { - $params = self::getConfigParams($container, $configuration); + $params = self::getConfigParams($container); self::configureConfiguration($container, $params, $configuration); } @@ -75,47 +74,17 @@ public static function setApplicationDocumentManager(Application $application, $ $helperSet->set(new DocumentManagerHelper($dm), 'dm'); } - protected static function getConfigParams(ContainerInterface $container, ConfigurationInterface $configuration): array + public static function getConfigParams(ContainerInterface $container): array { - $params = [ + return [ 'collection_name' => $container->getParameter('mongo_db_migrations.collection_name'), 'database_name' => $container->getParameter('mongo_db_migrations.database_name'), 'script_dir_name' => $container->getParameter('mongo_db_migrations.script_dir_name'), + 'name' => $container->getParameter('mongo_db_migrations.name'), + 'namespace' => $container->getParameter('mongo_db_migrations.namespace'), + 'dir_name' => $container->getParameter('mongo_db_migrations.dir_name'), + 'prefix' => \AntiMattr\MongoDB\Migrations\Configuration\Configuration::DEFAULT_PREFIX, ]; - - if ($configuration instanceof Configuration && !empty($configuration->getMigrationsBundleAlias())) { - $bundleAlias = $configuration->getMigrationsBundleAlias(); - $bundles = $container->getParameter('mongo_db_migrations.bundles'); - if (empty($bundles[$bundleAlias])) { - throw new \RuntimeException("Bundle with alias {$bundleAlias} has no registered migration configs"); - } - $bundleConfig = $bundles[$bundleAlias]; - /** @var Bundle[] $bundles */ - $bundles = $container->get('kernel')->getBundles(); - $targetBundle = null; - foreach ($bundles as $bundle) { - $containerExtension = $bundle->getContainerExtension(); - if (null !== $containerExtension && $containerExtension->getAlias() === $bundleAlias) { - $targetBundle = $bundle; - break; - } - } - if (null === $targetBundle) { - throw new \RuntimeException("Bundle with alias {$bundleAlias} is not found"); - } - - $params['namespace'] = $targetBundle->getNamespace() . '\\' . $bundleConfig['namespace']; - $params['dir_name'] = $targetBundle->getPath() . '/' . $bundleConfig['dir_name']; - $params['name'] = $bundleConfig['name']; - $params['prefix'] = $bundleAlias; - } else { - $params['prefix'] = 'app'; - $params['name'] = $container->getParameter('mongo_db_migrations.name'); - $params['namespace'] = $container->getParameter('mongo_db_migrations.namespace'); - $params['dir_name'] = $container->getParameter('mongo_db_migrations.dir_name'); - } - - return $params; } public static function getConfigParamsForBundle( @@ -146,6 +115,22 @@ public static function getConfigParamsForBundle( ]; } + public static function getBundleByAlias(string $bundleAlias, ContainerInterface $container): ?BundleInterface + { + /** @var BundleInterface[] $bundles */ + $bundles = $container->get('kernel')->getBundles(); + $targetBundle = null; + foreach ($bundles as $bundle) { + $containerExtension = $bundle->getContainerExtension(); + if (null !== $containerExtension && $containerExtension->getAlias() === $bundleAlias) { + $targetBundle = $bundle; + break; + } + } + + return $targetBundle; + } + /** * injectContainerToMigrations. * diff --git a/Command/MigrationsExecuteCommand.php b/Command/MigrationsExecuteCommand.php index d033cf0..42701f5 100644 --- a/Command/MigrationsExecuteCommand.php +++ b/Command/MigrationsExecuteCommand.php @@ -1,4 +1,5 @@ */ class MigrationsExecuteCommand extends ExecuteCommand { + use BundleAwareTrait; + + protected $container; + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + protected function configure(): void { parent::configure(); - $this - ->setName('mongodb:migrations:execute') - ->addOption('dm', null, InputOption::VALUE_OPTIONAL, 'The document manager to use for this command.', 'default_document_manager') + $this->setName('mongodb:migrations:execute'); + $this->addOption( + 'bundle', + null, + InputOption::VALUE_OPTIONAL, + 'Alias of bundle for which action is performed', + Configuration::DEFAULT_PREFIX + ); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); ; } @@ -35,9 +60,6 @@ public function execute(InputInterface $input, OutputInterface $output) { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); - $configuration = $this->getMigrationConfiguration($input, $output); - CommandHelper::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration); - parent::execute($input, $output); } } diff --git a/Command/MigrationsGenerateCommand.php b/Command/MigrationsGenerateCommand.php index c9fb7c7..0620882 100644 --- a/Command/MigrationsGenerateCommand.php +++ b/Command/MigrationsGenerateCommand.php @@ -12,10 +12,12 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; +use AntiMattr\MongoDB\Migrations\Configuration\Configuration; use AntiMattr\MongoDB\Migrations\Tools\Console\Command\GenerateCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * @author Matthew Fitzgerald @@ -24,6 +26,14 @@ class MigrationsGenerateCommand extends GenerateCommand { use BundleAwareTrait; + protected $container; + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + protected function configure(): void { parent::configure(); @@ -33,7 +43,8 @@ protected function configure(): void 'bundle', null, InputOption::VALUE_OPTIONAL, - 'Alias of bundle for which migration will be generated.' + 'Alias of bundle for which migration will be generated.', + Configuration::DEFAULT_PREFIX ); $this->addOption( 'dm', @@ -48,9 +59,6 @@ public function execute(InputInterface $input, OutputInterface $output): void { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); - $configuration = $this->getMigrationConfiguration($input, $output); - CommandHelper::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration); - parent::execute($input, $output); } } diff --git a/Command/MigrationsMigrateCommand.php b/Command/MigrationsMigrateCommand.php index 7bbd81f..f6bfe79 100644 --- a/Command/MigrationsMigrateCommand.php +++ b/Command/MigrationsMigrateCommand.php @@ -187,7 +187,7 @@ function ($message) use ($output) { $bundleExtension = $bundle->getContainerExtension(); if ( null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()]) - && !empty($bundleAliasesMap[$bundleExtension->getAlias()]) + && isset($bundleAliasesMap[$bundleExtension->getAlias()]) ) { $matchedBundles[] = $bundle; } diff --git a/Command/MigrationsVersionCommand.php b/Command/MigrationsVersionCommand.php index 807cd6f..c63a7ab 100644 --- a/Command/MigrationsVersionCommand.php +++ b/Command/MigrationsVersionCommand.php @@ -1,4 +1,5 @@ */ class MigrationsVersionCommand extends VersionCommand { + use BundleAwareTrait; + + protected $container; + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + + protected function configure(): void { parent::configure(); - $this - ->setName('mongodb:migrations:version') - ->addOption('dm', null, InputOption::VALUE_OPTIONAL, 'The document manager to use for this command.', 'default_document_manager') - ; + $this->setName('mongodb:migrations:version'); + $this->addOption( + 'bundle', + null, + InputOption::VALUE_OPTIONAL, + 'Alias of bundle for which action is performed', + Configuration::DEFAULT_PREFIX + ); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); } public function execute(InputInterface $input, OutputInterface $output) { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); - $configuration = $this->getMigrationConfiguration($input, $output); - CommandHelper::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration); - parent::execute($input, $output); } } From 011f8af8a5ee02eb53c51f975006e55756f116c0 Mon Sep 17 00:00:00 2001 From: watari Date: Thu, 28 Jun 2018 18:25:14 +0300 Subject: [PATCH 4/6] Removed unused code --- Command/BundleAwareTrait.php | 17 ++---------- Command/CommandHelper.php | 5 ++-- Configuration/Configuration.php | 37 -------------------------- Configuration/ConfigurationBuilder.php | 33 ----------------------- 4 files changed, 4 insertions(+), 88 deletions(-) delete mode 100644 Configuration/Configuration.php delete mode 100644 Configuration/ConfigurationBuilder.php diff --git a/Command/BundleAwareTrait.php b/Command/BundleAwareTrait.php index d30b89e..dcd8bf8 100644 --- a/Command/BundleAwareTrait.php +++ b/Command/BundleAwareTrait.php @@ -3,9 +3,7 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; -use AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\ConfigurationBuilder; use AntiMattr\MongoDB\Migrations\Configuration\Configuration; -use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationBuilderInterface; use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -27,14 +25,14 @@ trait BundleAwareTrait * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * - * @return \AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration + * @return \AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface */ /** * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * - * @return \AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration + * @return \AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface */ protected function getMigrationConfiguration(InputInterface $input, OutputInterface $output): ConfigurationInterface { @@ -71,15 +69,4 @@ protected function getMigrationConfiguration(InputInterface $input, OutputInterf return $this->configuration; } - - - /** - * Create instance of configuration builder for command. - * - * @return ConfigurationBuilderInterface - */ - protected function getConfigurationBuilder(): ConfigurationBuilderInterface - { - return ConfigurationBuilder::create(); - } } diff --git a/Command/CommandHelper.php b/Command/CommandHelper.php index b2febe1..022f6e0 100644 --- a/Command/CommandHelper.php +++ b/Command/CommandHelper.php @@ -12,7 +12,6 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; -use AntiMattr\Bundle\MongoDBMigrationsBundle\Configuration\Configuration; use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; use Doctrine\ODM\MongoDB\Tools\Console\Helper\DocumentManagerHelper; use Symfony\Bundle\FrameworkBundle\Console\Application; @@ -28,8 +27,8 @@ final class CommandHelper /** * configureMigrations. * - * @param ContainerInterface $container - * @param Configuration $configuration + * @param ContainerInterface $container + * @param ConfigurationInterface $configuration */ public static function configureMigrations(ContainerInterface $container, ConfigurationInterface $configuration) { diff --git a/Configuration/Configuration.php b/Configuration/Configuration.php deleted file mode 100644 index 60cd4cc..0000000 --- a/Configuration/Configuration.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ -class Configuration extends \AntiMattr\MongoDB\Migrations\Configuration\Configuration -{ - /** - * Alias of bundle for which command is running. - * - * @var string|null - */ - protected $migrationsBundleAlias; - - /** - * @return null|string - */ - public function getMigrationsBundleAlias(): ?string - { - return $this->migrationsBundleAlias; - } - - /** - * @param null|string $migrationsBundleAlias - * - * @return void - */ - public function setMigrationsBundleAlias(?string $migrationsBundleAlias): void - { - $this->migrationsBundleAlias = $migrationsBundleAlias; - } -} diff --git a/Configuration/ConfigurationBuilder.php b/Configuration/ConfigurationBuilder.php deleted file mode 100644 index 0323935..0000000 --- a/Configuration/ConfigurationBuilder.php +++ /dev/null @@ -1,33 +0,0 @@ - - */ -class ConfigurationBuilder extends \AntiMattr\MongoDB\Migrations\Configuration\ConfigurationBuilder -{ - - /** - * @inheritdoc - * - * @param Connection $connection - * @param OutputWriter $outputWriter - * - * @return ConfigurationInterface - */ - protected function createConfigurationInstance( - Connection $connection, - OutputWriter $outputWriter - ): ConfigurationInterface { - return new Configuration($connection, $outputWriter); - } -} From 301ae4666c3292215cebcc9bb0e1b541865034a2 Mon Sep 17 00:00:00 2001 From: watari Date: Thu, 28 Jun 2018 18:43:55 +0300 Subject: [PATCH 5/6] Updated logic for status command. Moved multi-bundle logic to BundleAwareTrait from migrate command. --- Command/BundleAwareTrait.php | 85 ++++++++++++++++++++++++ Command/MigrationsMigrateCommand.php | 97 +++------------------------- Command/MigrationsStatusCommand.php | 53 +++++++++++++-- 3 files changed, 140 insertions(+), 95 deletions(-) diff --git a/Command/BundleAwareTrait.php b/Command/BundleAwareTrait.php index dcd8bf8..8025018 100644 --- a/Command/BundleAwareTrait.php +++ b/Command/BundleAwareTrait.php @@ -5,9 +5,12 @@ use AntiMattr\MongoDB\Migrations\Configuration\Configuration; use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; +use AntiMattr\MongoDB\Migrations\OutputWriter; +use Doctrine\MongoDB\Connection; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpKernel\Bundle\BundleInterface; /** * Trait BundleAwareTrait @@ -69,4 +72,86 @@ protected function getMigrationConfiguration(InputInterface $input, OutputInterf return $this->configuration; } + + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return ConfigurationInterface[] + */ + protected function getMigrationConfigurations(InputInterface $input, OutputInterface $output): array + { + $configs = [$this->getMigrationConfiguration($input, $output)]; + + $includeAllBundles = $input->getOption('include-bundles'); + $bundleAliasesList = $input->getOption('include-bundle'); + + if (!empty($includeAllBundles) && !empty($bundleAliasesList)) { + throw new \InvalidArgumentException( + 'Options "include-bundles" and "include-bundle" cannot be specified simultaneously.' + ); + } + + $outputWriter = new OutputWriter( + function ($message) use ($output) { + return $output->writeln($message); + } + ); + $databaseConnection = $this->getDatabaseConnection($input); + $matchedBundles = []; + + if ($includeAllBundles) { + /** @var array $registeredBundles */ + $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); + /** @var BundleInterface[] $appBundles */ + $appBundles = $this->container->get('kernel')->getBundles(); + + foreach ($appBundles as $bundle) { + $bundleExtension = $bundle->getContainerExtension(); + if (null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()])) { + $matchedBundles[] = $bundle; + } + } + } elseif (!empty($bundleAliasesList)) { + /** @var array $registeredBundles */ + $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); + /** @var BundleInterface[] $appBundles */ + $appBundles = $this->container->get('kernel')->getBundles(); + $bundleAliasesMap = \array_flip($bundleAliasesList); + foreach ($appBundles as $bundle) { + $bundleExtension = $bundle->getContainerExtension(); + if ( + null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()]) + && isset($bundleAliasesMap[$bundleExtension->getAlias()]) + ) { + $matchedBundles[] = $bundle; + } + } + } + + foreach ($matchedBundles as $bundle) { + $configs[] = $this->createConfiguration( + $databaseConnection, + $outputWriter, + CommandHelper::getConfigParamsForBundle($this->container, $bundle) + ); + } + + return $configs; + } + + protected function createConfiguration( + Connection $connection, + OutputWriter $outputWriter, + array $params + ): ConfigurationInterface { + $configuration = $this->getConfigurationBuilder() + ->setConnection($connection) + ->setOutputWriter($outputWriter) + ->build(); + CommandHelper::configureConfiguration($this->container, $params, $configuration); + + return $configuration; + } } diff --git a/Command/MigrationsMigrateCommand.php b/Command/MigrationsMigrateCommand.php index f6bfe79..47f324c 100644 --- a/Command/MigrationsMigrateCommand.php +++ b/Command/MigrationsMigrateCommand.php @@ -12,22 +12,20 @@ namespace AntiMattr\Bundle\MongoDBMigrationsBundle\Command; use AntiMattr\MongoDB\Migrations\Configuration\Configuration; -use AntiMattr\MongoDB\Migrations\Configuration\Interfaces\ConfigurationInterface; -use AntiMattr\MongoDB\Migrations\OutputWriter; use AntiMattr\MongoDB\Migrations\Tools\Console\Command\MigrateCommand; -use Doctrine\MongoDB\Connection; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\HttpKernel\Bundle\Bundle; /** * @author Matthew Fitzgerald */ class MigrationsMigrateCommand extends MigrateCommand { + use BundleAwareTrait; + protected $container; @@ -54,6 +52,13 @@ protected function configure(): void InputOption::VALUE_NONE, 'Indicate that all migrations should be applied.' ); + $this->addOption( + 'bundle', + null, + InputOption::VALUE_OPTIONAL, + 'Alias of bundle for which migration will be generated.', + Configuration::DEFAULT_PREFIX + ); $this->addOption( 'dm', null, @@ -134,88 +139,4 @@ public function execute(InputInterface $input, OutputInterface $output) return 0; } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @return ConfigurationInterface[] - */ - protected function getMigrationConfigurations(InputInterface $input, OutputInterface $output): array - { - $configs = [ - $this->getMigrationConfiguration($input, $output), - ]; - CommandHelper::configureMigrations($this->container, $configs[0]); - - $includeAllBundles = $input->getOption('include-bundles'); - $bundleAliasesList = $input->getOption('include-bundle'); - - if (!empty($includeAllBundles) && !empty($bundleAliasesList)) { - throw new \InvalidArgumentException( - 'Options "include-bundles" and "include-bundle" cannot be specified simultaneously.' - ); - } - - $outputWriter = new OutputWriter( - function ($message) use ($output) { - return $output->writeln($message); - } - ); - $databaseConnection = $this->getDatabaseConnection($input); - $matchedBundles = []; - - if ($includeAllBundles) { - /** @var array $registeredBundles */ - $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); - /** @var Bundle[] $appBundles */ - $appBundles = $this->container->get('kernel')->getBundles(); - - foreach ($appBundles as $bundle) { - $bundleExtension = $bundle->getContainerExtension(); - if (null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()])) { - $matchedBundles[] = $bundle; - } - } - } elseif (!empty($bundleAliasesList)) { - /** @var array $registeredBundles */ - $registeredBundles = $this->container->getParameter('mongo_db_migrations.bundles'); - /** @var Bundle[] $appBundles */ - $appBundles = $this->container->get('kernel')->getBundles(); - $bundleAliasesMap = \array_flip($bundleAliasesList); - foreach ($appBundles as $bundle) { - $bundleExtension = $bundle->getContainerExtension(); - if ( - null !== $bundleExtension && !empty($registeredBundles[$bundleExtension->getAlias()]) - && isset($bundleAliasesMap[$bundleExtension->getAlias()]) - ) { - $matchedBundles[] = $bundle; - } - } - } - - foreach ($matchedBundles as $bundle) { - $configs[] = $this->createConfiguration( - $databaseConnection, - $outputWriter, - CommandHelper::getConfigParamsForBundle($this->container, $bundle) - ); - } - - return $configs; - } - - protected function createConfiguration( - Connection $connection, - OutputWriter $outputWriter, - array $params - ): ConfigurationInterface { - $configuration = $this->getConfigurationBuilder() - ->setConnection($connection) - ->setOutputWriter($outputWriter) - ->build(); - CommandHelper::configureConfiguration($this->container, $params, $configuration); - - return $configuration; - } } diff --git a/Command/MigrationsStatusCommand.php b/Command/MigrationsStatusCommand.php index 9571ed4..f3e5c14 100644 --- a/Command/MigrationsStatusCommand.php +++ b/Command/MigrationsStatusCommand.php @@ -1,4 +1,5 @@ */ class MigrationsStatusCommand extends StatusCommand { + use BundleAwareTrait; + + protected $container; + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + protected function configure(): void { parent::configure(); - $this - ->setName('mongodb:migrations:status') - ->addOption('dm', null, InputOption::VALUE_OPTIONAL, 'The document manager to use for this command.', 'default_document_manager') - ; + $this->setName('mongodb:migrations:status'); + $this->addOption( + 'include-bundle', + null, + InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, + 'Alias of bundle which migrations should be applied.' + ); + $this->addOption( + 'include-bundles', + null, + InputOption::VALUE_NONE, + 'Indicate that all migrations should be applied.' + ); + $this->addOption( + 'bundle', + null, + InputOption::VALUE_OPTIONAL, + 'Alias of bundle for which migration will be generated.', + Configuration::DEFAULT_PREFIX + ); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); } public function execute(InputInterface $input, OutputInterface $output) { CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); - $configuration = $this->getMigrationConfiguration($input, $output); - CommandHelper::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration); + $configurations = $this->getMigrationConfigurations($input, $output); + + foreach ($configurations as $configuration) { + $this->configuration = $configuration; + parent::execute($input, $output); + } - parent::execute($input, $output); } } From eaa0729de79b9223d31fec5c53a924035a193f7c Mon Sep 17 00:00:00 2001 From: watari Date: Sat, 21 Jul 2018 20:58:24 +0300 Subject: [PATCH 6/6] Added command that is fix BC caused by introducing prefix for migrations. --- Command/MigrationsBCFixCommand.php | 62 ++++++++++++++++++++++++++++++ Resources/config/services.xml | 7 ++++ Tests/bootstrap.php | 10 ----- 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 Command/MigrationsBCFixCommand.php diff --git a/Command/MigrationsBCFixCommand.php b/Command/MigrationsBCFixCommand.php new file mode 100644 index 0000000..227bbbd --- /dev/null +++ b/Command/MigrationsBCFixCommand.php @@ -0,0 +1,62 @@ + + */ +class MigrationsBCFixCommand extends BCFixCommand +{ + + protected $container; + + public function __construct(?string $name = null, ContainerInterface $container) + { + parent::__construct($name); + $this->container = $container; + } + + + protected function configure(): void + { + parent::configure(); + + $this->setName('mongodb:migrations:bc-fix'); + $this->addOption( + 'dm', + null, + InputOption::VALUE_OPTIONAL, + 'The document manager to use for this command.', + 'default_document_manager' + ); + } + + public function execute(InputInterface $input, OutputInterface $output): void + { + CommandHelper::setApplicationDocumentManager($this->getApplication(), $input->getOption('dm')); + $configuration = $this->getMigrationConfiguration($input, $output); + CommandHelper::configureConfiguration( + $this->container, + CommandHelper::getConfigParams($this->container), + $configuration + ); + + parent::execute($input, $output); + } +} diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 63cbfb3..fd6bd61 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -41,5 +41,12 @@ + + + + diff --git a/Tests/bootstrap.php b/Tests/bootstrap.php index 78f48d4..b3d9bbc 100644 --- a/Tests/bootstrap.php +++ b/Tests/bootstrap.php @@ -1,11 +1 @@