diff --git a/Neos.Flow/Classes/Aop/Builder/ProxyClassBuilder.php b/Neos.Flow/Classes/Aop/Builder/ProxyClassBuilder.php index b1052792f7..a175e0cf8d 100644 --- a/Neos.Flow/Classes/Aop/Builder/ProxyClassBuilder.php +++ b/Neos.Flow/Classes/Aop/Builder/ProxyClassBuilder.php @@ -441,10 +441,8 @@ public function buildProxyClass(string $targetClassName, array $aspectContainers * @param ClassNameIndex $targetClassNameCandidates target class names for advices * @param ClassNameIndex $treatedSubClasses Already treated (sub) classes to avoid duplication * @return ClassNameIndex The new collection of already treated classes - * @throws ClassLoadingForReflectionFailedException - * @throws \ReflectionException - * @throws InvalidClassException * @throws CannotBuildObjectException + * @throws \ReflectionException */ protected function proxySubClassesOfClassToEnsureAdvices(string $className, ClassNameIndex $targetClassNameCandidates, ClassNameIndex $treatedSubClasses): ClassNameIndex { diff --git a/Neos.Flow/Classes/Cache/CacheManager.php b/Neos.Flow/Classes/Cache/CacheManager.php index ede879875d..a1108b1353 100644 --- a/Neos.Flow/Classes/Cache/CacheManager.php +++ b/Neos.Flow/Classes/Cache/CacheManager.php @@ -374,9 +374,10 @@ protected function flushClassCachesByChangedFiles(array $changedFiles): void $flushDoctrineProxyCache = false; $flushPolicyCache = false; if (count($modifiedClassNamesWithUnderscores) > 0) { - $reflectionStatusCache = $this->getCache('Flow_Reflection_Status'); + $reflectionDataRuntimeCache = $this->getCache('Flow_Reflection_RuntimeData'); foreach (array_keys($modifiedClassNamesWithUnderscores) as $classNameWithUnderscores) { - $reflectionStatusCache->remove($classNameWithUnderscores); + $this->logger->debug('File change detected, removing reflection for ' . $classNameWithUnderscores); + $reflectionDataRuntimeCache->remove($classNameWithUnderscores); if ($flushDoctrineProxyCache === false && preg_match('/_Domain_Model_(.+)/', $classNameWithUnderscores) === 1) { $flushDoctrineProxyCache = true; } diff --git a/Neos.Flow/Classes/Command/CacheCommandController.php b/Neos.Flow/Classes/Command/CacheCommandController.php index 9782466b81..b04fb1b520 100644 --- a/Neos.Flow/Classes/Command/CacheCommandController.php +++ b/Neos.Flow/Classes/Command/CacheCommandController.php @@ -135,9 +135,6 @@ public function injectEnvironment(Environment $environment) * from running, the removal of any temporary data can be forced by specifying * the option --force. * - * This command does not remove the precompiled data provided by frozen - * packages unless the --force option is used. - * * @param boolean $force Force flushing of any temporary data * @return void * @see neos.flow:cache:warmup @@ -157,23 +154,6 @@ public function flushCommand(bool $force = false) $this->lockManager->unlockSite(); } - $frozenPackages = []; - foreach (array_keys($this->packageManager->getAvailablePackages()) as $packageKey) { - if ($this->packageManager->isPackageFrozen($packageKey)) { - $frozenPackages[] = $packageKey; - } - } - if ($frozenPackages !== []) { - $this->outputFormatted(PHP_EOL . 'Please note that the following package' . (count($frozenPackages) === 1 ? ' is' : 's are') . ' currently frozen: ' . PHP_EOL); - $this->outputFormatted(implode(PHP_EOL, $frozenPackages) . PHP_EOL, [], 2); - - $message = 'As code and configuration changes in these packages are not detected, the application may respond '; - $message .= 'unexpectedly if modifications were done anyway or the remaining code relies on these changes.' . PHP_EOL . PHP_EOL; - $message .= 'You may call package:refreeze all in order to refresh frozen packages or use the --force '; - $message .= 'option of this cache:flush command to flush caches if Flow becomes unresponsive.' . PHP_EOL; - $this->outputFormatted($message, [$frozenPackages]); - } - $this->sendAndExit(0); } diff --git a/Neos.Flow/Classes/Command/PackageCommandController.php b/Neos.Flow/Classes/Command/PackageCommandController.php index 25e6616f5a..e005fba02c 100644 --- a/Neos.Flow/Classes/Command/PackageCommandController.php +++ b/Neos.Flow/Classes/Command/PackageCommandController.php @@ -32,25 +32,6 @@ class PackageCommandController extends CommandController */ protected $packageManager; - /** - * @var array - */ - protected $settings; - - /** - * @var Bootstrap - */ - protected $bootstrap; - - /** - * @param array $settings The Flow settings - * @return void - */ - public function injectSettings(array $settings) - { - $this->settings = $settings; - } - /** * @param PackageManager $packageManager * @return void @@ -60,15 +41,6 @@ public function injectPackageManager(PackageManager $packageManager) $this->packageManager = $packageManager; } - /** - * @param Bootstrap $bootstrap - * @return void - */ - public function injectBootstrap(Bootstrap $bootstrap) - { - $this->bootstrap = $bootstrap; - } - /** * Create a new package * @@ -112,9 +84,7 @@ public function createCommand(string $packageKey, string $packageType = PackageI public function listCommand(bool $loadingOrder = false) { $availablePackages = []; - $frozenPackages = []; $longestPackageKey = 0; - $freezeSupported = $this->bootstrap->getContext()->isDevelopment(); foreach ($this->packageManager->getAvailablePackages() as $packageKey => $package) { if (strlen($packageKey) > $longestPackageKey) { @@ -123,9 +93,6 @@ public function listCommand(bool $loadingOrder = false) $availablePackages[$packageKey] = $package; - if ($this->packageManager->isPackageFrozen($packageKey)) { - $frozenPackages[$packageKey] = $package; - } } if ($loadingOrder === false) { @@ -135,13 +102,7 @@ public function listCommand(bool $loadingOrder = false) $this->outputLine('PACKAGES:'); /** @var PackageInterface|PackageKeyAwareInterface $package */ foreach ($availablePackages as $package) { - $frozenState = ($freezeSupported && isset($frozenPackages[$package->getPackageKey()]) ? '* ' : ' '); - $this->outputLine(' ' . str_pad($package->getPackageKey(), $longestPackageKey + 3) . $frozenState . str_pad($package->getInstalledVersion(), 15)); - } - - if (count($frozenPackages) > 0 && $freezeSupported) { - $this->outputLine(); - $this->outputLine(' * frozen package'); + $this->outputLine(' ' . str_pad($package->getPackageKey(), $longestPackageKey + 3) . str_pad($package->getInstalledVersion(), 15)); } } @@ -165,47 +126,11 @@ public function listCommand(bool $loadingOrder = false) * @return void * @see neos.flow:package:unfreeze * @see neos.flow:package:refreeze + * @deprecated since 8.4 */ public function freezeCommand(string $packageKey = 'all') { - if (!$this->bootstrap->getContext()->isDevelopment()) { - $this->outputLine('Package freezing is only supported in Development context.'); - $this->quit(3); - } - - $packagesToFreeze = []; - - if ($packageKey === 'all') { - foreach (array_keys($this->packageManager->getAvailablePackages()) as $packageKey) { - if (!$this->packageManager->isPackageFrozen($packageKey)) { - $packagesToFreeze[] = $packageKey; - } - } - if ($packagesToFreeze === []) { - $this->outputLine('Nothing to do, all packages were already frozen.'); - $this->quit(0); - } - } elseif ($packageKey === 'blackberry') { - $this->outputLine('http://bit.ly/freeze-blackberry'); - $this->quit(42); - } else { - if (!$this->packageManager->isPackageAvailable($packageKey)) { - $this->outputLine('Package "%s" is not available.', [$packageKey]); - $this->quit(2); - } - - if ($this->packageManager->isPackageFrozen($packageKey)) { - $this->outputLine('Package "%s" was already frozen.', [$packageKey]); - $this->quit(0); - } - - $packagesToFreeze = [$packageKey]; - } - - foreach ($packagesToFreeze as $packageKey) { - $this->packageManager->freezePackage($packageKey); - $this->outputLine('Froze package "%s".', [$packageKey]); - } + $this->outputLine('Package freezing is no longer supported, this command is deprecated and will be removed with 9.0.'); } /** @@ -222,47 +147,11 @@ public function freezeCommand(string $packageKey = 'all') * @return void * @see neos.flow:package:freeze * @see neos.flow:cache:flush + * @deprecated since 8.4 */ public function unfreezeCommand(string $packageKey = 'all') { - if (!$this->bootstrap->getContext()->isDevelopment()) { - $this->outputLine('Package freezing is only supported in Development context.'); - $this->quit(3); - } - - $packagesToUnfreeze = []; - - if ($packageKey === 'all') { - foreach (array_keys($this->packageManager->getAvailablePackages()) as $packageKey) { - if ($this->packageManager->isPackageFrozen($packageKey)) { - $packagesToUnfreeze[] = $packageKey; - } - } - if ($packagesToUnfreeze === []) { - $this->outputLine('Nothing to do, no packages were frozen.'); - $this->quit(0); - } - } else { - if ($packageKey === null) { - $this->outputLine('You must specify a package to unfreeze.'); - $this->quit(1); - } - - if (!$this->packageManager->isPackageAvailable($packageKey)) { - $this->outputLine('Package "%s" is not available.', [$packageKey]); - $this->quit(2); - } - if (!$this->packageManager->isPackageFrozen($packageKey)) { - $this->outputLine('Package "%s" was not frozen.', [$packageKey]); - $this->quit(0); - } - $packagesToUnfreeze = [$packageKey]; - } - - foreach ($packagesToUnfreeze as $packageKey) { - $this->packageManager->unfreezePackage($packageKey); - $this->outputLine('Unfroze package "%s".', [$packageKey]); - } + $this->outputLine('Package freezing is no longer supported, this command is deprecated and will be removed with 9.0.'); } /** @@ -280,50 +169,11 @@ public function unfreezeCommand(string $packageKey = 'all') * @return void * @see neos.flow:package:freeze * @see neos.flow:cache:flush + * @deprecated since 8.4 */ public function refreezeCommand(string $packageKey = 'all') { - if (!$this->bootstrap->getContext()->isDevelopment()) { - $this->outputLine('Package freezing is only supported in Development context.'); - $this->quit(3); - } - - $packagesToRefreeze = []; - - if ($packageKey === 'all') { - foreach (array_keys($this->packageManager->getAvailablePackages()) as $packageKey) { - if ($this->packageManager->isPackageFrozen($packageKey)) { - $packagesToRefreeze[] = $packageKey; - } - } - if ($packagesToRefreeze === []) { - $this->outputLine('Nothing to do, no packages were frozen.'); - $this->quit(0); - } - } else { - if ($packageKey === null) { - $this->outputLine('You must specify a package to refreeze.'); - $this->quit(1); - } - - if (!$this->packageManager->isPackageAvailable($packageKey)) { - $this->outputLine('Package "%s" is not available.', [$packageKey]); - $this->quit(2); - } - if (!$this->packageManager->isPackageFrozen($packageKey)) { - $this->outputLine('Package "%s" was not frozen.', [$packageKey]); - $this->quit(0); - } - $packagesToRefreeze = [$packageKey]; - } - - foreach ($packagesToRefreeze as $packageKey) { - $this->packageManager->refreezePackage($packageKey); - $this->outputLine('Refroze package "%s".', [$packageKey]); - } - - Scripts::executeCommand('neos.flow:cache:flush', $this->settings, false); - $this->sendAndExit(0); + $this->outputLine('Package freezing is no longer supported, this command is deprecated and will be removed with 9.0.'); } /** diff --git a/Neos.Flow/Classes/Core/Booting/Scripts.php b/Neos.Flow/Classes/Core/Booting/Scripts.php index 7614aedf75..74edfed2e0 100644 --- a/Neos.Flow/Classes/Core/Booting/Scripts.php +++ b/Neos.Flow/Classes/Core/Booting/Scripts.php @@ -247,7 +247,7 @@ public static function initializeSystemLogger(Bootstrap $bootstrap): void $throwableStorage = self::initializeExceptionStorage($bootstrap, $settings); $bootstrap->setEarlyInstance(ThrowableStorageInterface::class, $throwableStorage); - /** @var PsrLoggerFactoryInterface $psrLoggerFactoryName */ + /** @var class-string $psrLoggerFactoryName */ $psrLoggerFactoryName = $settings['log']['psr3']['loggerFactory']; $psrLogConfigurations = $settings['log']['psr3'][$psrLoggerFactoryName] ?? []; $psrLogFactory = $psrLoggerFactoryName::create($psrLogConfigurations); @@ -578,10 +578,6 @@ public static function initializeSystemFileMonitor(Bootstrap $bootstrap) /** @var FlowPackageInterface $package */ foreach ($packageManager->getFlowPackages() as $packageKey => $package) { - if ($packageManager->isPackageFrozen($packageKey)) { - continue; - } - self::monitorDirectoryIfItExists($fileMonitors['Flow_ConfigurationFiles'], $package->getConfigurationPath(), '\.y(a)?ml$'); self::monitorDirectoryIfItExists($fileMonitors['Flow_TranslationFiles'], $package->getResourcesPath() . 'Private/Translations/', '\.xlf'); diff --git a/Neos.Flow/Classes/Package.php b/Neos.Flow/Classes/Package.php index b69f7dd552..5b37920ffe 100644 --- a/Neos.Flow/Classes/Package.php +++ b/Neos.Flow/Classes/Package.php @@ -19,6 +19,7 @@ use Neos\Flow\ObjectManagement\Proxy; use Neos\Flow\Package\Package as BasePackage; use Neos\Flow\Package\PackageManager; +use Neos\Flow\Reflection\ReflectionService; use Neos\Flow\ResourceManagement\ResourceManager; use Neos\Flow\ResourceManagement\ResourceRepository; use Neos\Flow\Security\Authentication\AuthenticationProviderManager; @@ -88,10 +89,6 @@ public function boot(Core\Bootstrap $bootstrap) /** @var PackageManager $packageManager */ $packageManager = $bootstrap->getEarlyInstance(Package\PackageManager::class); foreach ($packageManager->getFlowPackages() as $packageKey => $package) { - if ($packageManager->isPackageFrozen($packageKey)) { - continue; - } - $publicResourcesPath = $package->getResourcesPath() . 'Public/'; if (is_dir($publicResourcesPath)) { $publicResourcesFileMonitor->monitorDirectory($publicResourcesPath); @@ -122,6 +119,7 @@ public function boot(Core\Bootstrap $bootstrap) $dispatcher->connect(Core\Bootstrap::class, 'bootstrapShuttingDown', ObjectManagement\ObjectManagerInterface::class, 'shutdown'); $dispatcher->connect(Core\Bootstrap::class, 'bootstrapShuttingDown', Configuration\ConfigurationManager::class, 'shutdown'); + /** @see ReflectionService::saveToCache() */ $dispatcher->connect(Core\Bootstrap::class, 'bootstrapShuttingDown', Reflection\ReflectionService::class, 'saveToCache'); $dispatcher->connect(Command\CoreCommandController::class, 'finishedCompilationRun', Security\Authorization\Privilege\Method\MethodPrivilegePointcutFilter::class, 'savePolicyCache'); diff --git a/Neos.Flow/Classes/Package/PackageManager.php b/Neos.Flow/Classes/Package/PackageManager.php index e59f351efc..9ac23f7aa9 100644 --- a/Neos.Flow/Classes/Package/PackageManager.php +++ b/Neos.Flow/Classes/Package/PackageManager.php @@ -229,6 +229,7 @@ public function getAvailablePackages(): array * precompiled reflection data in order to improve performance. * * @return array + * @deprecated since 8.4 */ public function getFrozenPackages(): array { @@ -403,6 +404,7 @@ public function createPackage($packageKey, array $manifest = [], $packagesPath = * @param string $toAbsolutePath * @return void * @throws FilesException + * @deprecated since 8.4 */ protected function movePackage($fromAbsolutePath, $toAbsolutePath): void { @@ -411,95 +413,16 @@ protected function movePackage($fromAbsolutePath, $toAbsolutePath): void Files::removeDirectoryRecursively($fromAbsolutePath); } - /** - * Freezes a package - * - * @param string $packageKey The package to freeze - * @return void - * @throws Exception\PackageStatesFileNotWritableException - * @throws Exception\UnknownPackageException - * @throws \Neos\Flow\Exception - * @throws FilesException - */ - public function freezePackage($packageKey): void - { - if (!$this->bootstrap->getContext()->isDevelopment()) { - throw new \LogicException('Package freezing is only supported in Development context.', 1338810870); - } - - if (!$this->isPackageAvailable($packageKey)) { - throw new Exception\UnknownPackageException('Package "' . $packageKey . '" is not available.', 1331715956); - } - if ($this->isPackageFrozen($packageKey)) { - return; - } - - $package = $this->packages[$packageKey]; - $this->bootstrap->getObjectManager()->get(ReflectionService::class)->freezePackageReflection($packageKey); - - $this->packageStatesConfiguration['packages'][$package->getComposerName()]['frozen'] = true; - $this->savePackageStates($this->packageStatesConfiguration); - } - /** * Tells if a package is frozen * * @param string $packageKey The package to check * @return boolean + * @deprecated since 8.4 */ public function isPackageFrozen($packageKey): bool { - if (!isset($this->packages[$packageKey])) { - return false; - } - $composerName = $this->packages[$packageKey]->getComposerName(); - - return ( - $this->bootstrap->getContext()->isDevelopment() - && isset($this->packageStatesConfiguration['packages'][$composerName]['frozen']) - && $this->packageStatesConfiguration['packages'][$composerName]['frozen'] === true - ); - } - - /** - * Unfreezes a package - * - * @param string $packageKey The package to unfreeze - * @return void - * @throws Exception\PackageStatesFileNotWritableException - * @throws \Neos\Flow\Exception - * @throws FilesException - */ - public function unfreezePackage($packageKey): void - { - if (!$this->isPackageFrozen($packageKey)) { - return; - } - if (!isset($this->packages[$packageKey])) { - return; - } - $composerName = $this->packages[$packageKey]->getComposerName(); - - $this->bootstrap->getObjectManager()->get(ReflectionService::class)->unfreezePackageReflection($packageKey); - - unset($this->packageStatesConfiguration['packages'][$composerName]['frozen']); - $this->savePackageStates($this->packageStatesConfiguration); - } - - /** - * Refreezes a package - * - * @param string $packageKey The package to refreeze - * @return void - * @throws \Neos\Flow\Exception - */ - public function refreezePackage($packageKey): void - { - if (!$this->isPackageFrozen($packageKey)) { - return; - } - - $this->bootstrap->getObjectManager()->get(ReflectionService::class)->unfreezePackageReflection($packageKey); + return false; } /** diff --git a/Neos.Flow/Classes/Reflection/ReflectionService.php b/Neos.Flow/Classes/Reflection/ReflectionService.php index 9119bf1143..e3d88610f0 100644 --- a/Neos.Flow/Classes/Reflection/ReflectionService.php +++ b/Neos.Flow/Classes/Reflection/ReflectionService.php @@ -18,24 +18,17 @@ use Doctrine\ORM\Mapping as ORM; use Doctrine\Persistence\Proxy as DoctrineProxy; use Neos\Cache\Exception; -use Neos\Cache\Frontend\StringFrontend; use Neos\Cache\Frontend\VariableFrontend; use Neos\Flow\Annotations as Flow; -use Neos\Flow\Core\ApplicationContext; use Neos\Flow\Log\Utility\LogEnvironment; use Neos\Flow\ObjectManagement\Proxy\ProxyInterface; -use Neos\Flow\Package; -use Neos\Flow\Package\PackageManager; use Neos\Flow\Persistence\RepositoryInterface; use Neos\Flow\Reflection\Exception\ClassLoadingForReflectionFailedException; use Neos\Flow\Reflection\Exception\ClassSchemaConstraintViolationException; use Neos\Flow\Reflection\Exception\InvalidClassException; use Neos\Flow\Reflection\Exception\InvalidPropertyTypeException; use Neos\Flow\Reflection\Exception\InvalidValueObjectException; -use Neos\Flow\Utility\Environment; -use Neos\Utility\Arrays; use Neos\Utility\Exception\FilesException; -use Neos\Utility\Files; use Neos\Utility\TypeHandling; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; @@ -74,15 +67,9 @@ class ReflectionService // Implementations of an interface protected const DATA_INTERFACE_IMPLEMENTATIONS = 1; - // Implemented interfaces of a class - protected const DATA_CLASS_INTERFACES = 2; - // Subclasses of a class protected const DATA_CLASS_SUBCLASSES = 3; - // Class tag values - protected const DATA_CLASS_TAGS_VALUES = 4; - // Class annotations protected const DATA_CLASS_ANNOTATIONS = 5; protected const DATA_CLASS_ABSTRACT = 6; @@ -111,14 +98,9 @@ class ReflectionService protected Reader $annotationReader; protected array $availableClassNames = []; - protected StringFrontend $statusCache; - protected VariableFrontend $reflectionDataCompiletimeCache; protected VariableFrontend $reflectionDataRuntimeCache; protected VariableFrontend $classSchemataRuntimeCache; protected ?LoggerInterface $logger = null; - protected PackageManager $packageManager; - protected Environment $environment; - protected ApplicationContext $context; /** * The doctrine PHP parser which can parse "use" statements. Is initialized @@ -133,11 +115,6 @@ class ReflectionService */ protected array $useStatementsForClassCache; - /** - * In Production context, with frozen caches, this flag will be true - */ - protected bool $loadFromClassSchemaRuntimeCache = false; - protected array $settings = []; /** @@ -179,24 +156,6 @@ class ReflectionService */ protected array $methodAnnotationsRuntimeCache = []; - /** - * Sets the status cache - * - * The cache must be set before initializing the Reflection Service - */ - public function setStatusCache(StringFrontend $cache): void - { - $this->statusCache = $cache; - $backend = $this->statusCache->getBackend(); - if (is_callable([$backend, 'initializeObject'])) { - $backend->initializeObject(); - } - } - - public function setReflectionDataCompiletimeCache(VariableFrontend $cache): void - { - $this->reflectionDataCompiletimeCache = $cache; - } public function setReflectionDataRuntimeCache(VariableFrontend $cache): void { @@ -218,16 +177,6 @@ public function injectLogger(LoggerInterface $logger): void $this->logger = $logger; } - public function injectPackageManager(PackageManager $packageManager): void - { - $this->packageManager = $packageManager; - } - - public function injectEnvironment(Environment $environment): void - { - $this->environment = $environment; - } - protected function getDoctrinePhpParser(): PhpParser { if ($this->doctrinePhpParser === null) { @@ -241,20 +190,14 @@ protected function getDoctrinePhpParser(): PhpParser * Initialize the reflection service lazily * * This method must be run only after all dependencies have been injected. - * - * @throws FilesException - * @throws \Neos\Flow\Utility\Exception */ protected function initialize(): void { - $this->context = $this->environment->getContext(); - - if ($this->hasFrozenCacheInProduction()) { - $this->classReflectionData = $this->reflectionDataRuntimeCache->get('__classNames'); + $classNames = $this->reflectionDataRuntimeCache->get('__classNames'); + if (is_array($classNames)) { + $this->classReflectionData = $classNames; $this->annotatedClasses = $this->reflectionDataRuntimeCache->get('__annotatedClasses'); - $this->loadFromClassSchemaRuntimeCache = true; - } else { - $this->loadClassReflectionCompiletimeCache(); + $this->classesByMethodAnnotations = $this->reflectionDataRuntimeCache->get('__classesByMethodAnnotations'); } $this->annotationReader = new AnnotationReader(); @@ -273,13 +216,14 @@ protected function initialize(): void * This method is called by the Compile Time Object Manager which also determines * the list of classes to consider for reflection. * + * @param array $availableClassNames * @throws ClassLoadingForReflectionFailedException * @throws ClassSchemaConstraintViolationException * @throws Exception - * @throws FilesException * @throws InvalidClassException + * @throws InvalidPropertyTypeException + * @throws InvalidValueObjectException * @throws ReflectionException - * @throws \Neos\Flow\Utility\Exception */ public function buildReflectionData(array $availableClassNames): void { @@ -295,6 +239,8 @@ public function buildReflectionData(array $availableClassNames): void * Tells if the specified class is known to this reflection service and * reflection information is available. * + * @param class-string $className + * * @api */ public function isClassReflected(string $className): bool @@ -304,7 +250,7 @@ public function isClassReflected(string $className): bool } $className = $this->cleanClassName($className); - return isset($this->classReflectionData[$className]); + return isset($this->classReflectionData[$className]) && is_array($this->classReflectionData[$className]); } /** @@ -330,15 +276,10 @@ public function getAllClassNames(): array */ public function getDefaultImplementationClassNameForInterface(string $interfaceName): string|bool { - if (!$this->initialized) { - $this->initialize(); - } - $interfaceName = $this->cleanClassName($interfaceName); - if (interface_exists($interfaceName) === false) { throw new \InvalidArgumentException('"' . $interfaceName . '" does not exist or is not the name of an interface.', 1238769559); } - $this->loadOrReflectClassIfNecessary($interfaceName); + $interfaceName = $this->prepareClassReflectionForUsage($interfaceName); $classNamesFound = isset($this->classReflectionData[$interfaceName][self::DATA_INTERFACE_IMPLEMENTATIONS]) ? array_keys($this->classReflectionData[$interfaceName][self::DATA_INTERFACE_IMPLEMENTATIONS]) : []; if (count($classNamesFound) === 1) { @@ -362,21 +303,16 @@ public function getDefaultImplementationClassNameForInterface(string $interfaceN * Searches for and returns all class names of implementations of the given object type * (interface name). If no class implementing the interface was found, an empty array is returned. * - * @throws ClassLoadingForReflectionFailedException - * @throws InvalidClassException + * @param class-string $interfaceName + * @return array * @api */ public function getAllImplementationClassNamesForInterface(string $interfaceName): array { - if (!$this->initialized) { - $this->initialize(); - } - $interfaceName = $this->cleanClassName($interfaceName); - if (interface_exists($interfaceName) === false) { throw new \InvalidArgumentException('"' . $interfaceName . '" does not exist or is not the name of an interface.', 1238769560); } - $this->loadOrReflectClassIfNecessary($interfaceName); + $interfaceName = $this->prepareClassReflectionForUsage($interfaceName); return (isset($this->classReflectionData[$interfaceName][self::DATA_INTERFACE_IMPLEMENTATIONS])) ? array_keys($this->classReflectionData[$interfaceName][self::DATA_INTERFACE_IMPLEMENTATIONS]) : []; } @@ -387,22 +323,14 @@ public function getAllImplementationClassNamesForInterface(string $interfaceName * * @psalm-param class-string $className * @psalm-return array - * @throws ClassLoadingForReflectionFailedException - * @throws InvalidClassException * @api */ public function getAllSubClassNamesForClass(string $className): array { - if (!$this->initialized) { - $this->initialize(); - } - $className = $this->cleanClassName($className); - if (class_exists($className) === false) { throw new \InvalidArgumentException('"' . $className . '" does not exist or is not the name of a class.', 1257168042); } - $this->loadOrReflectClassIfNecessary($className); - + $className = $this->prepareClassReflectionForUsage($className); return (isset($this->classReflectionData[$className][self::DATA_CLASS_SUBCLASSES])) ? array_keys($this->classReflectionData[$className][self::DATA_CLASS_SUBCLASSES]) : []; } @@ -762,7 +690,7 @@ public function hasMethod(string $className, string $methodName): bool * Returns all tags and their values the specified method is tagged with * * @throws ReflectionException - * @api + * @deprecated since 8.4 */ public function getMethodTagsValues(string $className, string $methodName): array { @@ -866,6 +794,7 @@ public function getPropertyTagValues(string $className, string $propertyName, st */ public function getPropertyType(string $className, string $propertyName): ?string { + $className = $this->prepareClassReflectionForUsage($className); return $this->classReflectionData[$className][self::DATA_CLASS_PROPERTIES][$propertyName][self::DATA_PROPERTY_TYPE] ?? null; } @@ -991,6 +920,12 @@ public function getClassSchema(string|object $classNameOrObject): ?ClassSchema /** * Initializes the ReflectionService, cleans the given class name and finally reflects the class if necessary. + * + * @param class-string $className + * @return string + * @throws ClassLoadingForReflectionFailedException + * @throws InvalidClassException + * @throws ReflectionException */ protected function prepareClassReflectionForUsage(string $className): string { @@ -1012,14 +947,17 @@ protected function prepareClassReflectionForUsage(string $className): string * @throws ClassSchemaConstraintViolationException * @throws Exception * @throws InvalidClassException + * @throws InvalidPropertyTypeException + * @throws InvalidValueObjectException * @throws ReflectionException */ protected function reflectEmergedClasses(): void { - $classNamesToReflect = []; - foreach ($this->availableClassNames as $classNamesInOnePackage) { - $classNamesToReflect = array_merge($classNamesToReflect, $classNamesInOnePackage); + $availableClassnames = []; + foreach ($this->availableClassNames as $classNamesInPackage) { + $availableClassnames[] = $classNamesInPackage; } + $classNamesToReflect = array_merge([], ...$availableClassnames); $reflectedClassNames = array_keys($this->classReflectionData); sort($classNamesToReflect); sort($reflectedClassNames); @@ -1032,7 +970,7 @@ protected function reflectEmergedClasses(): void $count = 0; $classNameFilterFunction = function ($className) use (&$count): bool { - $this->reflectClass($className); + $this->loadOrReflectClassIfNecessary($className); if ( !$this->isClassAnnotatedWith($className, Flow\Entity::class) && !$this->isClassAnnotatedWith($className, ORM\Entity::class) && @@ -1092,10 +1030,14 @@ protected function reflectClass(string $className): void } $class = new ClassReflection($className); - if (!isset($this->classReflectionData[$className])) { + if (!isset($this->classReflectionData[$className]) || !is_array($this->classReflectionData[$className])) { $this->classReflectionData[$className] = []; } + if (!isset($this->classReflectionData[$className][self::DATA_INTERFACE_IMPLEMENTATIONS]) && $class->isInterface()) { + $this->classReflectionData[$className][self::DATA_INTERFACE_IMPLEMENTATIONS] = []; + } + if ($class->isAbstract() || $class->isInterface()) { $this->classReflectionData[$className][self::DATA_CLASS_ABSTRACT] = true; } @@ -1140,7 +1082,6 @@ protected function reflectClass(string $className): void // important for comparisons when checking if classes have changed in a // Development context. ksort($this->classReflectionData); - $this->updatedReflectionData[$className] = true; } @@ -1159,9 +1100,10 @@ public function reflectClassProperty(string $className, PropertyReflection $prop $this->classReflectionData[$className][self::DATA_CLASS_PROPERTIES][$propertyName][self::DATA_PROPERTY_TYPE] = trim((string)$property->getType(), '?'); } - $visibility = $property->isPublic() ? self::VISIBILITY_PUBLIC : ($property->isProtected() ? self::VISIBILITY_PROTECTED : self::VISIBILITY_PRIVATE); + $visibility = $this->extractVisibility($property); $this->classReflectionData[$className][self::DATA_CLASS_PROPERTIES][$propertyName][self::DATA_PROPERTY_VISIBILITY] = $visibility; + foreach ($property->getTagsValues() as $tagName => $tagValues) { $tagValues = $this->reflectPropertyTag($className, $property, $tagName, $tagValues); if ($tagValues === null) { @@ -1217,8 +1159,8 @@ protected function reflectPropertyTag(string $className, PropertyReflection $pro protected function addParentClass(string $className, ClassReflection $parentClass): void { $parentClassName = $parentClass->getName(); - if (!isset($this->classReflectionData[$parentClassName])) { - $this->reflectClass($parentClassName); + if (!$this->isClassReflected($parentClassName)) { + $this->loadOrReflectClassIfNecessary($parentClassName); } $this->classReflectionData[$parentClassName][self::DATA_CLASS_SUBCLASSES][$className] = true; } @@ -1235,9 +1177,10 @@ protected function addImplementedInterface(string $className, ClassReflection $i } $interfaceName = $interface->getName(); - if (!isset($this->classReflectionData[$interfaceName])) { - $this->reflectClass($interfaceName); + if (!$this->isClassReflected($interfaceName)) { + $this->loadOrReflectClassIfNecessary($interfaceName); } + $this->classReflectionData[$interfaceName][self::DATA_INTERFACE_IMPLEMENTATIONS][$className] = true; } @@ -1255,8 +1198,7 @@ protected function reflectClassMethod(string $className, MethodReflection $metho if ($method->isStatic()) { $this->classReflectionData[$className][self::DATA_CLASS_METHODS][$methodName][self::DATA_METHOD_STATIC] = true; } - $visibility = $method->isPublic() ? self::VISIBILITY_PUBLIC : ($method->isProtected() ? self::VISIBILITY_PROTECTED : self::VISIBILITY_PRIVATE); - $this->classReflectionData[$className][self::DATA_CLASS_METHODS][$methodName][self::DATA_METHOD_VISIBILITY] = $visibility; + $this->classReflectionData[$className][self::DATA_CLASS_METHODS][$methodName][self::DATA_METHOD_VISIBILITY] = $this->extractVisibility($method); foreach ($this->getMethodAnnotations($className, $methodName) as $methodAnnotation) { $annotationClassName = get_class($methodAnnotation); @@ -1294,6 +1236,15 @@ protected function reflectClassMethod(string $className, MethodReflection $metho } } + protected function extractVisibility(MethodReflection|PropertyReflection $reflection): int + { + return match (true) { + $reflection->isPublic() => self::VISIBILITY_PUBLIC, + $reflection->isProtected() => self::VISIBILITY_PROTECTED, + default => self::VISIBILITY_PRIVATE + }; + } + /** * @param string $className * @param MethodReflection $method @@ -1369,7 +1320,7 @@ protected function expandType(ClassReflection $class, string $type): string // and then we try to find "use" statements for the class. $className = $class->getName(); if (!isset($this->useStatementsForClassCache[$className])) { - $this->useStatementsForClassCache[$className] = $this->getDoctrinePhpParser()->parseClass($class); + $this->useStatementsForClassCache[$className] = $this->getDoctrinePhpParser()->parseUseStatements($class); } $useStatementsForClass = $this->useStatementsForClassCache[$className]; @@ -1404,10 +1355,12 @@ protected function getParentClasses(ClassReflection $class, array $parentClasses /** * Builds class schemata from classes annotated as entities or value objects * + * @param array $classNames * @throws ClassLoadingForReflectionFailedException * @throws ClassSchemaConstraintViolationException * @throws Exception * @throws InvalidClassException + * @throws InvalidPropertyTypeException * @throws InvalidValueObjectException */ protected function buildClassSchemata(array $classNames): void @@ -1730,26 +1683,9 @@ protected function convertParameterReflectionToArray(ParameterReflection $parame */ protected function forgetChangedClasses(): void { - $frozenNamespaces = []; - foreach ($this->packageManager->getAvailablePackages() as $packageKey => $package) { - if ($this->packageManager->isPackageFrozen($packageKey)) { - $frozenNamespaces = array_merge($frozenNamespaces, $package->getNamespaces()); - } - } - $frozenNamespaces = array_unique($frozenNamespaces); - $classNames = array_keys($this->classReflectionData); - foreach ($frozenNamespaces as $namespace) { - $namespace .= '\\'; - foreach ($classNames as $index => $className) { - if (str_starts_with($className, $namespace)) { - unset($classNames[$index]); - } - } - } - foreach ($classNames as $className) { - if (!$this->statusCache->has($this->produceCacheIdentifierFromClassName($className))) { + if (!$this->reflectionDataRuntimeCache->has($this->produceCacheIdentifierFromClassName($className))) { $this->forgetClass($className); } } @@ -1812,57 +1748,6 @@ protected function forgetClass($className): void unset($this->classesCurrentlyBeingForgotten[$className]); } - /** - * Tries to load the reflection data from the compile time cache. - * - * The compile time cache is only supported for Development context and thus - * this function will return in any other context. - * - * If no reflection data was found, this method will at least load the precompiled - * reflection data of any possible frozen package. Even if precompiled reflection - * data could be loaded, false will be returned in order to signal that other - * packages still need to be reflected. - * - * @return bool true if reflection data could be loaded, otherwise false - * @throws FilesException - * @throws \Neos\Flow\Utility\Exception - */ - protected function loadClassReflectionCompiletimeCache(): bool - { - $data = $this->reflectionDataCompiletimeCache->get('ReflectionData'); - - if ($data !== false) { - foreach ($data as $propertyName => $propertyValue) { - $this->$propertyName = $propertyValue; - } - - return true; - } - - if (!$this->context->isDevelopment()) { - return false; - } - - $useIgBinary = extension_loaded('igbinary'); - foreach ($this->packageManager->getAvailablePackages() as $packageKey => $package) { - if (!$this->packageManager->isPackageFrozen($packageKey)) { - continue; - } - - $pathAndFilename = $this->getPrecompiledReflectionStoragePath() . $packageKey . '.dat'; - if (!file_exists($pathAndFilename)) { - continue; - } - - $data = ($useIgBinary ? igbinary_unserialize(file_get_contents($pathAndFilename)) : unserialize(file_get_contents($pathAndFilename))); - foreach ($data as $propertyName => $propertyValue) { - $this->$propertyName = Arrays::arrayMergeRecursiveOverrule($this->$propertyName, $propertyValue); - } - } - - return false; - } - /** * Loads reflection data from the cache or reflects the class if needed. * @@ -1879,155 +1764,38 @@ protected function loadClassReflectionCompiletimeCache(): bool */ protected function loadOrReflectClassIfNecessary(string $className): void { - if (!isset($this->classReflectionData[$className]) || is_array($this->classReflectionData[$className])) { + if ($this->isClassReflected($className)) { return; } - if ($this->loadFromClassSchemaRuntimeCache === true) { - $this->classReflectionData[$className] = $this->reflectionDataRuntimeCache->get($this->produceCacheIdentifierFromClassName($className)); + $this->classReflectionData[$className] = $this->reflectionDataRuntimeCache->get($this->produceCacheIdentifierFromClassName($className)); + if ($this->isClassReflected($className)) { return; } $this->reflectClass($className); } - /** - * Stores the current reflection data related to classes of the specified package - * in the PrecompiledReflectionData directory for the current context. - * - * This method is used by the package manager. - * - * @param (int|string) $packageKey - * - * @psalm-param array-key $packageKey - */ - public function freezePackageReflection($packageKey): void - { - if (!$this->initialized) { - $this->initialize(); - } - if (empty($this->availableClassNames)) { - $this->availableClassNames = $this->reflectionDataRuntimeCache->get('__availableClassNames'); - } - - $reflectionData = [ - 'classReflectionData' => $this->classReflectionData, - 'classSchemata' => $this->classSchemata, - 'annotatedClasses' => $this->annotatedClasses, - 'classesByMethodAnnotations' => $this->classesByMethodAnnotations - ]; - - $reflectionData['classReflectionData'] = $this->filterArrayByClassesInPackageNamespace($reflectionData['classReflectionData'], $packageKey); - $reflectionData['classSchemata'] = $this->filterArrayByClassesInPackageNamespace($reflectionData['classSchemata'], $packageKey); - $reflectionData['annotatedClasses'] = $this->filterArrayByClassesInPackageNamespace($reflectionData['annotatedClasses'], $packageKey); - - $methodAnnotationsFilters = function ($className) use ($packageKey): bool { - return (isset($this->availableClassNames[$packageKey]) && in_array($className, $this->availableClassNames[$packageKey], true)); - }; - - foreach ($reflectionData['classesByMethodAnnotations'] as $annotationClassName => $classNames) { - $reflectionData['classesByMethodAnnotations'][$annotationClassName] = array_filter($classNames, $methodAnnotationsFilters); - } - - $precompiledReflectionStoragePath = $this->getPrecompiledReflectionStoragePath(); - if (!is_dir($precompiledReflectionStoragePath)) { - Files::createDirectoryRecursively($precompiledReflectionStoragePath); - } - $pathAndFilename = $precompiledReflectionStoragePath . $packageKey . '.dat'; - file_put_contents($pathAndFilename, extension_loaded('igbinary') ? igbinary_serialize($reflectionData) : serialize($reflectionData)); - } - - /** - * Filter an array of entries where keys are class names by being in the given package namespace. - * - * @param int|string $packageKey - * - * @psalm-param array-key $packageKey - */ - protected function filterArrayByClassesInPackageNamespace(array $array, $packageKey): array - { - return array_filter($array, function ($className) use ($packageKey) { - return (isset($this->availableClassNames[$packageKey]) && in_array($className, $this->availableClassNames[$packageKey], true)); - }, ARRAY_FILTER_USE_KEY); - } - - /** - * Removes the precompiled reflection data of a frozen package - * - * This method is used by the package manager. - * - * @throws FilesException - * @throws \Neos\Flow\Utility\Exception - */ - public function unfreezePackageReflection(string $packageKey): void - { - if (!$this->initialized) { - $this->initialize(); - } - $pathAndFilename = $this->getPrecompiledReflectionStoragePath() . $packageKey . '.dat'; - if (file_exists($pathAndFilename)) { - unlink($pathAndFilename); - } - } - /** * Exports the internal reflection data into the ReflectionData cache * * This method is triggered by a signal which is connected to the bootstrap's * shutdown sequence. * - * If the reflection data has previously been loaded from the runtime cache, - * saving it is omitted as changes are not expected. - * - * In Production context the whole cache is written at once and then frozen in - * order to be consistent. Frozen cache data in Development is only produced for - * classes contained in frozen packages. * @throws Exception */ public function saveToCache(): void { - if ($this->hasFrozenCacheInProduction()) { - return; - } if (!$this->initialized) { $this->initialize(); } - if ($this->loadFromClassSchemaRuntimeCache === true) { - return; - } - if (!empty($this->availableClassNames)) { - $this->reflectionDataRuntimeCache->set('__availableClassNames', $this->availableClassNames); - } - - if ($this->updatedReflectionData !== []) { - $this->updateReflectionData(); - } - - if ($this->context->isProduction()) { - $this->saveProductionData(); + if (empty($this->updatedReflectionData)) { return; } - $this->saveDevelopmentData(); - } - - /** - * Save reflection data to cache in Development context. - * - * @throws FilesException - * @throws \Neos\Flow\Utility\Exception - */ - protected function saveDevelopmentData(): void - { - foreach (array_keys($this->packageManager->getFrozenPackages()) as $packageKey) { - $pathAndFilename = $this->getPrecompiledReflectionStoragePath() . $packageKey . '.dat'; - if (!file_exists($pathAndFilename)) { - $this->log(sprintf('Rebuilding precompiled reflection data for frozen package %s.', $packageKey), LogLevel::DEBUG); - $this->freezePackageReflection($packageKey); - } - } + $this->saveProductionData(); } /** @@ -2037,55 +1805,27 @@ protected function saveDevelopmentData(): void */ protected function saveProductionData(): void { - $this->reflectionDataRuntimeCache->flush(); - $this->classSchemataRuntimeCache->flush(); - $classNames = []; foreach ($this->classReflectionData as $className => $reflectionData) { - $classNames[$className] = true; + if ($this->isClassReflected($className)) { + $classNames[$className] = true; + } + } + + foreach (array_keys($this->updatedReflectionData) as $className) { + $reflectionData = $this->classReflectionData[$className]; $cacheIdentifier = $this->produceCacheIdentifierFromClassName($className); $this->reflectionDataRuntimeCache->set($cacheIdentifier, $reflectionData); if (isset($this->classSchemata[$className])) { $this->classSchemataRuntimeCache->set($cacheIdentifier, $this->classSchemata[$className]); } } + $this->reflectionDataRuntimeCache->set('__classNames', $classNames); $this->reflectionDataRuntimeCache->set('__annotatedClasses', $this->annotatedClasses); + $this->reflectionDataRuntimeCache->set('__classesByMethodAnnotations', $this->classesByMethodAnnotations); - /** @phpstan-ignore-next-line will be refactored with neos 9 */ - $this->reflectionDataRuntimeCache->getBackend()->freeze(); - /** @phpstan-ignore-next-line will be refactored with neos 9 */ - $this->classSchemataRuntimeCache->getBackend()->freeze(); - - $this->log(sprintf('Built and froze reflection runtime caches (%s classes).', count($this->classReflectionData)), LogLevel::INFO); - } - - /** - * Set updated reflection data to caches. - * - * @throws Exception - */ - protected function updateReflectionData(): void - { - $this->log(sprintf('Found %s classes whose reflection data was not cached previously.', count($this->updatedReflectionData)), LogLevel::DEBUG); - - foreach (array_keys($this->updatedReflectionData) as $className) { - $this->statusCache->set($this->produceCacheIdentifierFromClassName($className), ''); - } - - $data = []; - $propertyNames = [ - 'classReflectionData', - 'classSchemata', - 'annotatedClasses', - 'classesByMethodAnnotations' - ]; - - foreach ($propertyNames as $propertyName) { - $data[$propertyName] = $this->$propertyName; - } - - $this->reflectionDataCompiletimeCache->set('ReflectionData', $data); + $this->log(sprintf('Updated reflection caches (%s classes).', count($this->updatedReflectionData)), LogLevel::INFO); } /** @@ -2112,22 +1852,7 @@ protected function log(string $message, string $severity = LogLevel::INFO, array $this->logger?->log($severity, $message, $additionalData); } - /** - * @throws \Neos\Flow\Utility\Exception - * @throws FilesException - */ - protected function getPrecompiledReflectionStoragePath(): string - { - return Files::concatenatePaths([$this->environment->getPathToTemporaryDirectory(), 'PrecompiledReflectionData/']) . '/'; - } - - protected function hasFrozenCacheInProduction(): bool - { - /** @phpstan-ignore-next-line will be refactored with neos 9 */ - return $this->environment->getContext()->isProduction() && $this->reflectionDataRuntimeCache->getBackend()->isFrozen(); - } - - private function renderParameterType(?\ReflectionType $parameterType): ?string + private function renderParameterType(?\ReflectionType $parameterType = null): string|null { $that = $this; return match (true) { diff --git a/Neos.Flow/Classes/Reflection/ReflectionServiceFactory.php b/Neos.Flow/Classes/Reflection/ReflectionServiceFactory.php index c86ead9de3..a0673a2269 100644 --- a/Neos.Flow/Classes/Reflection/ReflectionServiceFactory.php +++ b/Neos.Flow/Classes/Reflection/ReflectionServiceFactory.php @@ -64,12 +64,8 @@ public function create(): ReflectionService $reflectionService = new ReflectionService(); $reflectionService->injectLogger($this->bootstrap->getEarlyInstance(PsrLoggerFactoryInterface::class)->get('systemLogger')); $reflectionService->injectSettings($settings); - $reflectionService->injectPackageManager($this->bootstrap->getEarlyInstance(PackageManager::class)); - $reflectionService->setStatusCache($cacheManager->getCache('Flow_Reflection_Status')); - $reflectionService->setReflectionDataCompiletimeCache($cacheManager->getCache('Flow_Reflection_CompiletimeData')); $reflectionService->setReflectionDataRuntimeCache($cacheManager->getCache('Flow_Reflection_RuntimeData')); $reflectionService->setClassSchemataRuntimeCache($cacheManager->getCache('Flow_Reflection_RuntimeClassSchemata')); - $reflectionService->injectEnvironment($this->bootstrap->getEarlyInstance(Environment::class)); $this->reflectionService = $reflectionService; return $reflectionService; diff --git a/Neos.Flow/Configuration/Caches.yaml b/Neos.Flow/Configuration/Caches.yaml index b7238738c1..e9ea1501f1 100644 --- a/Neos.Flow/Configuration/Caches.yaml +++ b/Neos.Flow/Configuration/Caches.yaml @@ -93,16 +93,23 @@ Flow_Persistence_Doctrine_Results: Flow_Persistence_Doctrine_SecondLevel: backend: Neos\Cache\Backend\SimpleFileBackend -# Flow_Reflection* # +# DEPRECATED since 8.4 +# These caches will be removed in 9.0, they are unused so you can safely remove any configuration for them. # Flow_Reflection_Status: frontend: Neos\Cache\Frontend\StringFrontend backend: Neos\Cache\Backend\SimpleFileBackend Flow_Reflection_CompiletimeData: backend: Neos\Cache\Backend\SimpleFileBackend -Flow_Reflection_RuntimeData: [] -Flow_Reflection_RuntimeClassSchemata: [] + +# Flow_Reflection +# +# +Flow_Reflection_RuntimeData: + backend: Neos\Cache\Backend\SimpleFileBackend +Flow_Reflection_RuntimeClassSchemata: + backend: Neos\Cache\Backend\SimpleFileBackend # Flow_Resource_Status # diff --git a/Neos.Flow/Tests/Functional/Reflection/ReflectionServiceTest.php b/Neos.Flow/Tests/Functional/Reflection/ReflectionServiceTest.php index ac8807d3fe..a306e8ab96 100644 --- a/Neos.Flow/Tests/Functional/Reflection/ReflectionServiceTest.php +++ b/Neos.Flow/Tests/Functional/Reflection/ReflectionServiceTest.php @@ -57,6 +57,7 @@ public function classSchemaCanBeBuiltForAggregateRootsWithPlainOldPhpBaseClasses /** * @test * @throws + * @deprecated */ public function theReflectionServiceCorrectlyBuildsMethodTagsValues(): void { diff --git a/Neos.Flow/Tests/Unit/Cache/CacheManagerTest.php b/Neos.Flow/Tests/Unit/Cache/CacheManagerTest.php index 232e8e577a..5401b60a91 100644 --- a/Neos.Flow/Tests/Unit/Cache/CacheManagerTest.php +++ b/Neos.Flow/Tests/Unit/Cache/CacheManagerTest.php @@ -277,7 +277,7 @@ public function flushSystemCachesByChangedFilesWithChangedClassFileRemovesCacheE { $objectClassCache = $this->registerCache('Flow_Object_Classes'); $objectConfigurationCache = $this->registerCache('Flow_Object_Configuration'); - $this->registerCache('Flow_Reflection_Status'); + $this->registerCache('Flow_Reflection_RuntimeData'); $objectClassCache->expects(self::once())->method('remove')->with('Neos_Flow_Cache_CacheManager'); $objectConfigurationCache->expects(self::once())->method('remove')->with('allCompiledCodeUpToDate'); @@ -294,7 +294,7 @@ public function flushSystemCachesByChangedFilesWithChangedTestFileRemovesCacheEn { $objectClassCache = $this->registerCache('Flow_Object_Classes'); $objectConfigurationCache = $this->registerCache('Flow_Object_Configuration'); - $this->registerCache('Flow_Reflection_Status'); + $this->registerCache('Flow_Reflection_RuntimeData'); $objectClassCache->expects(self::once())->method('remove')->with('Neos_Flow_Tests_Unit_Cache_CacheManagerTest'); $objectConfigurationCache->expects(self::once())->method('remove')->with('allCompiledCodeUpToDate'); diff --git a/Neos.Flow/Tests/Unit/Package/PackageManagerTest.php b/Neos.Flow/Tests/Unit/Package/PackageManagerTest.php index ab32cb06e3..72bb58373c 100644 --- a/Neos.Flow/Tests/Unit/Package/PackageManagerTest.php +++ b/Neos.Flow/Tests/Unit/Package/PackageManagerTest.php @@ -470,36 +470,4 @@ public function createPackageEmitsPackageStatesUpdatedSignal() $this->mockDispatcher->expects(self::once())->method('dispatch')->with(PackageManager::class, 'packageStatesUpdated'); $this->packageManager->createPackage('Some.Package', [], 'vfs://Test/Packages/Application'); } - - /** - * @test - */ - public function freezePackageEmitsPackageStatesUpdatedSignal() - { - $this->mockApplicationContext->expects(self::atLeastOnce())->method('isDevelopment')->will(self::returnValue(true)); - - $this->packageManager->createPackage('Some.Package', [ - 'name' => 'some/package' - ], 'vfs://Test/Packages/Application'); - - $this->mockDispatcher->expects(self::once())->method('dispatch')->with(PackageManager::class, 'packageStatesUpdated'); - $this->packageManager->freezePackage('Some.Package'); - } - - /** - * @test - */ - public function unfreezePackageEmitsPackageStatesUpdatedSignal() - { - $this->mockApplicationContext->expects(self::atLeastOnce())->method('isDevelopment')->will(self::returnValue(true)); - - $this->packageManager->createPackage('Some.Package', [ - 'name' => 'some/package', - 'type' => 'neos-package' - ], 'vfs://Test/Packages/Application'); - $this->packageManager->freezePackage('Some.Package'); - - $this->mockDispatcher->expects(self::once())->method('dispatch')->with(PackageManager::class, 'packageStatesUpdated'); - $this->packageManager->unfreezePackage('Some.Package'); - } } diff --git a/Neos.FluidAdaptor/Classes/Package.php b/Neos.FluidAdaptor/Classes/Package.php index 9f6a9cd540..84a32d31ed 100644 --- a/Neos.FluidAdaptor/Classes/Package.php +++ b/Neos.FluidAdaptor/Classes/Package.php @@ -48,10 +48,6 @@ public function boot(Bootstrap $bootstrap) $packageManager = $bootstrap->getEarlyInstance(PackageManager::class); /** @var FlowPackageInterface $package */ foreach ($packageManager->getFlowPackages() as $packageKey => $package) { - if ($packageManager->isPackageFrozen($packageKey)) { - continue; - } - foreach (['Templates', 'Partials', 'Layouts'] as $path) { $templatesPath = $package->getResourcesPath() . 'Private/' . $path;