public function updateConfig() { $aliases = ExtendClassLoadingUtils::getAliases($this->cacheDir); $this->clear(true); $extensions = $this->getExtensions(); foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_PRE_UPDATE)) { $extension->preUpdate(); } } $extendProvider = $this->em->getExtendConfigProvider(); $extendConfigs = $extendProvider->getConfigs(null, true); foreach ($extendConfigs as $extendConfig) { if ($extendConfig->is('upgradeable')) { if ($extendConfig->is('is_extend')) { $this->checkSchema($extendConfig, $aliases); } // some bundles can change configs in pre persist events, // and other bundles can produce more changes depending on already made, it's a bit hacky, // but it's a service operation so called inevitable evil $extendProvider->flush(); if ($this->checkState($extendConfig)) { $extendProvider->flush(); } } } foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_POST_UPDATE)) { $extension->postUpdate(); } } // do one more flush to make sure changes made by post update extensions are saved $extendProvider->flush(); $this->clear(); }
/** * Update config. * * @param array $originsToSkip */ public function updateConfig(array $originsToSkip = []) { $aliases = ExtendClassLoadingUtils::getAliases($this->cacheDir); $this->clear(true); $extensions = $this->getExtensions(); foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_PRE_UPDATE)) { $extension->preUpdate(); } } $extendProvider = $this->em->getExtendConfigProvider(); $extendConfigs = $extendProvider->filter($this->createOriginFilterCallback($originsToSkip), null, true); foreach ($extendConfigs as $extendConfig) { if ($extendConfig->is('upgradeable')) { if ($extendConfig->is('is_extend')) { $this->checkSchema($extendConfig, $aliases, $originsToSkip); } // some bundles can change configs in pre persist events, // and other bundles can produce more changes depending on already made, it's a bit hacky, // but it's a service operation so called inevitable evil $extendProvider->flush(); // the clearing of an entity manager gives a performance gain of 4 times $extendProvider->getConfigManager()->getEntityManager()->clear(); $this->updateStateValues($extendConfig); } } foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_POST_UPDATE)) { $extension->postUpdate(); } } // do one more flush to make sure changes made by post update extensions are saved $extendProvider->flush(); $this->clear(); }
/** * Sets class aliases for extended entities. * * @param string $cacheDir The cache directory * * @throws \ReflectionException */ protected function setClassAliases($cacheDir) { $aliases = ExtendClassLoadingUtils::getAliases($cacheDir); foreach ($aliases as $className => $alias) { if (class_exists($className)) { if (class_exists($alias, false)) { /*throw new \ReflectionException( sprintf( 'The alias "%1$s" for the class "%2$s" cannot be registered ' . 'because the class "%1$s" is already loaded. ' . 'This may happen if this class or a derived class ' . 'is used in EntityConfigDumperExtension or EntityGeneratorExtension.', $alias, $className ) );*/ } else { class_alias($className, $alias); } } } }
/** * Update config. * * @param callable|null $filter function (ConfigInterface $config) : bool */ public function updateConfig($filter = null) { $aliases = ExtendClassLoadingUtils::getAliases($this->cacheDir); $this->clear(true); $extensions = $this->getExtensions(); foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_PRE_UPDATE)) { $extension->preUpdate(); } } $configProvider = $this->configManager->getProvider('extend'); $extendConfigs = null === $filter ? $configProvider->getConfigs(null, true) : $configProvider->filter($filter, null, true); foreach ($extendConfigs as $extendConfig) { if ($extendConfig->is('upgradeable')) { if ($extendConfig->is('is_extend')) { $this->checkSchema($extendConfig, $configProvider, $aliases, $filter); } $this->updateStateValues($extendConfig, $configProvider); } } foreach ($extensions as $extension) { if ($extension->supports(self::ACTION_POST_UPDATE)) { $extension->postUpdate(); } } $this->configManager->flush(); $this->clear(); }