vendor/pimcore/pimcore/lib/Migrations/Configuration/ConfigurationFactory.php line 184

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Migrations\Configuration;
  16. use Doctrine\DBAL\Migrations\OutputWriter;
  17. use Pimcore\Db\ConnectionInterface;
  18. use Pimcore\Event\TestEvents;
  19. use Pimcore\Extension\Bundle\Installer\MigrationInstallerInterface;
  20. use Pimcore\Extension\Bundle\PimcoreBundleInterface;
  21. use Symfony\Component\DependencyInjection\ContainerAwareInterface;
  22. use Symfony\Component\DependencyInjection\ContainerInterface;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\HttpKernel\Bundle\BundleInterface;
  25. /**
  26.  * @deprecated will be removed in Pimcore 10
  27.  */
  28. class ConfigurationFactory implements EventSubscriberInterface
  29. {
  30.     /**
  31.      * @var ContainerInterface
  32.      */
  33.     private $container;
  34.     /**
  35.      * @var MigrationSetConfiguration[]
  36.      */
  37.     private $migrationSets = [];
  38.     /**
  39.      * @var Configuration[]
  40.      */
  41.     private $configurations = [];
  42.     /**
  43.      * @var InstallConfiguration[]
  44.      */
  45.     private $installConfigurations = [];
  46.     public function __construct(ContainerInterface $container, array $migrationSetConfigurations = [])
  47.     {
  48.         $this->container $container;
  49.         $this->buildMigrationSets($migrationSetConfigurations);
  50.     }
  51.     public static function getSubscribedEvents()
  52.     {
  53.         // reset configurations when test kernel boots
  54.         return [
  55.             TestEvents::KERNEL_BOOTED => 'reset',
  56.         ];
  57.     }
  58.     private function buildMigrationSets(array $configurations)
  59.     {
  60.         foreach ($configurations as $configuration) {
  61.             $this->registerMigrationSet(MigrationSetConfiguration::fromConfig($configuration));
  62.         }
  63.     }
  64.     public function getForSet(
  65.         string $set,
  66.         ConnectionInterface $connection,
  67.         OutputWriter $outputWriter null
  68.     ) {
  69.         $migrationSet $this->getMigrationSet($set);
  70.         $configuration $this->getConfiguration($migrationSet$connection$outputWriter);
  71.         $this->injectContainerToVersions($configuration);
  72.         return $configuration;
  73.     }
  74.     public function getForBundle(
  75.         BundleInterface $bundle,
  76.         ConnectionInterface $connection,
  77.         OutputWriter $outputWriter null
  78.     ): Configuration {
  79.         $migrationSet $this->getMigrationSetForBundle($bundle);
  80.         $configuration $this->getConfiguration($migrationSet$connection$outputWriter);
  81.         if ($bundle instanceof PimcoreBundleInterface) {
  82.             $installer $bundle->getInstaller();
  83.             if (null !== $installer && $installer instanceof MigrationInstallerInterface) {
  84.                 $configuration->setInstaller($installer);
  85.             }
  86.         }
  87.         $this->injectContainerToVersions($configuration);
  88.         return $configuration;
  89.     }
  90.     protected function getConfiguration(
  91.         MigrationSetConfiguration $migrationSet,
  92.         ConnectionInterface $connection,
  93.         OutputWriter $outputWriter null
  94.     ): Configuration {
  95.         if (isset($this->configurations[$migrationSet->getIdentifier()])) {
  96.             return $this->configurations[$migrationSet->getIdentifier()];
  97.         }
  98.         // fetch custom connection if migration set defines a dedicated one
  99.         if (null !== $migrationSet->getConnection()) {
  100.             $connection $this->container->get(sprintf(
  101.                 'doctrine.dbal.%s_connection',
  102.                 $migrationSet->getConnection()
  103.             ));
  104.         }
  105.         $configuration = new Configuration(
  106.             $migrationSet->getIdentifier(),
  107.             $connection,
  108.             $outputWriter
  109.         );
  110.         $this->configureConfiguration($configuration$migrationSet);
  111.         $this->configurations[$migrationSet->getIdentifier()] = $configuration;
  112.         return $configuration;
  113.     }
  114.     /**
  115.      * Creates a dedicated install configuration from an existing configuration
  116.      *
  117.      * @param Configuration $configuration
  118.      * @param MigrationInstallerInterface $installer
  119.      *
  120.      * @return InstallConfiguration
  121.      */
  122.     public function getInstallConfiguration(
  123.         Configuration $configuration,
  124.         MigrationInstallerInterface $installer
  125.     ): InstallConfiguration {
  126.         $migrationSetId $configuration->getMigrationSet();
  127.         if (isset($this->installConfigurations[$migrationSetId])) {
  128.             return $this->installConfigurations[$migrationSetId];
  129.         }
  130.         $migrationSet $this->getMigrationSet($migrationSetId);
  131.         // pipe messages to original config output writer
  132.         $outputWriter = new OutputWriter(function ($message) use ($configuration) {
  133.             $configuration->getOutputWriter()->write($message);
  134.         });
  135.         $installConfiguration = new InstallConfiguration(
  136.             $installer,
  137.             $configuration->getMigrationSet(),
  138.             $configuration->getConnection(),
  139.             $outputWriter
  140.         );
  141.         $this->configureConfiguration($installConfiguration$migrationSet);
  142.         $this->installConfigurations[$migrationSetId] = $installConfiguration;
  143.         return $installConfiguration;
  144.     }
  145.     /**
  146.      * Reset all registered configurations. Can be necessary during tests when rebuilding the DB.
  147.      */
  148.     public function reset()
  149.     {
  150.         foreach ($this->configurations as $configuration) {
  151.             $configuration->reset();
  152.         }
  153.         foreach ($this->installConfigurations as $installConfiguration) {
  154.             $installConfiguration->reset();
  155.         }
  156.     }
  157.     /**
  158.      * Applies migration set configuration to configuration instance
  159.      *
  160.      * @param Configuration $configuration
  161.      * @param MigrationSetConfiguration $migrationSet
  162.      */
  163.     protected function configureConfiguration(Configuration $configurationMigrationSetConfiguration $migrationSet)
  164.     {
  165.         $configuration->setName($migrationSet->getName());
  166.         $configuration->setMigrationsNamespace($migrationSet->getNamespace());
  167.         $configuration->setMigrationsDirectory($migrationSet->getDirectory());
  168.     }
  169.     protected function injectContainerToVersions(Configuration $configuration)
  170.     {
  171.         $versions $configuration->getMigrations();
  172.         foreach ($versions as $version) {
  173.             $migration $version->getMigration();
  174.             if ($migration instanceof ContainerAwareInterface) {
  175.                 $migration->setContainer($this->container);
  176.             }
  177.         }
  178.     }
  179.     private function getMigrationSetForBundle(BundleInterface $bundle): MigrationSetConfiguration
  180.     {
  181.         if (!isset($this->migrationSets[$bundle->getName()])) {
  182.             $this->registerMigrationSet($this->buildBundleMigrationSet($bundle));
  183.         }
  184.         return $this->migrationSets[$bundle->getName()];
  185.     }
  186.     protected function buildBundleMigrationSet(BundleInterface $bundle)
  187.     {
  188.         return new MigrationSetConfiguration(
  189.             $bundle->getName(),
  190.             $bundle->getName() . ' Migrations',
  191.             $bundle->getNamespace() . '\\Migrations',
  192.             $bundle->getPath() . '/Migrations'
  193.         );
  194.     }
  195.     private function registerMigrationSet(MigrationSetConfiguration $migrationSet)
  196.     {
  197.         if (isset($this->migrationSets[$migrationSet->getIdentifier()])) {
  198.             throw new \RuntimeException(sprintf('Migration set "%s" is already registered.'$migrationSet->getIdentifier()));
  199.         }
  200.         $this->migrationSets[$migrationSet->getIdentifier()] = $migrationSet;
  201.     }
  202.     protected function getMigrationSet(string $set): MigrationSetConfiguration
  203.     {
  204.         if (!isset($this->migrationSets[$set])) {
  205.             throw new \InvalidArgumentException(sprintf('Migration set "%s" is not registered.'$set));
  206.         }
  207.         return $this->migrationSets[$set];
  208.     }
  209. }