Overview of merged pull requests¶
Previously there were three different implementations of the composition of a temporary directory path name. The one in ProxyClassLoader didn’t use SubContexts correctly. This change unifies all implementations to a central static method composeTemporaryDirectoryName().
Previous error message:
include(): Failed opening '/var/www/myproject/Data//Temporary/Development/Local/AvailableProxyClasses.php' for inclusion (include_path='.:/usr/share/php')
What I did Fixed the behavior of the \Neos\Flow\Security\Authorization\Privilege\Entity\Doctrine\EntityPrivilege if you execute an in operation on an empty array.
How to verify it
matcher: 'isType("Neos\\Neos\\Domain\\Model\\Site") && !property("nodeName").in("context.userInformationContext.siteNodeNames")'
If getSiteNodeNames() evaluates to  which is possible and valid, the PropertyGenerator tries to to getParameter() on this value which can only be applied to scalar values.
This is caused by only checking on an exact null, but an empty array should also be ignored.
Rebased follow-up to #1681
When substr($metaData, 0, -self::EXPIRYTIME_LENGTH)`on `$metadata in the cache FileBackend.findIdentifiersByTag() method fails, false is passed to explode() causing:
Exception in line 253 of /…/FileBackend.php: explode() expects parameter 2 to be string, boolean given
This fixes that by casting the result to a string.
Currently the method saveProductionData() from the ReflectionService writes to both caches reflectionDataRuntimeCache and classSchemataRuntimeCache but flushes only the former first.
Additionally the hasFrozenCacheInProduction() method only checks the first cache.
This allows a race condition where the classSchemataRuntimeCache is built and frozen but reflectionDataRuntimeCache isn’t.
This change ensures the classSchemataRuntimeCache is also flushed.
Exception #1323344192 in line 68 of /var/www/Packages/Libraries/neos/cache/Classes/Frontend/VariableFrontend.php: Cannot add or modify cache entry because the backend of cache "Flow_Reflection_RuntimeClassSchemata" is frozen.
<!– Thanks for your contribution, we appreciate it!
Please read through our pull request guidelines, there are some interesting things there: https://discuss.neos.io/t/creating-a-pull-request/506
And one more thing… Don’t forget about the tests! –>
What I did Single line docblocks would break AOP compilation because the end-comment string */ would be interpreted as part of the comment.
How I did it The end-comment string */ is now removed from all lines before parsing them. This means that the previous check for the end of the comment if ($line === ‘*/)` no longer works but as far as I could determine this explicit check is not actually needed.
How to verify it There are tests
- [x] Code follows the PSR-2 coding style
- [x] Tests have been created, run and adjusted as needed
- [x] The PR is created against the [lowest maintained branch](https://www.neos.io/features/release-roadmap.html)
The namespace change introduced with doctrine/persistence 1.3.x makes use of class_alias to create a b/c layer over the old class names (see https://github.com/greg0ire/type_deprecation_experiment). However, this broke for a couple of our depending packages that still used the old Doctrine\Common\Persistence\ObjectMananger class as a method typehint. The reason is, that PHP Reflection returns different values for aliased method parameter types when using ReflectionParameter::getClass()->getName() vs. ReflectionParameter::getType()->getName(). The former returns the name of the actual class, instead of the alias, while the latter returns the actual name that was used in the typehint, regardless if it is an alias only.
In turn, this led our dependency injection to try to inject classes that it was not aware of and led to issues like https://github.com/yeebase/Yeebase.TwoFactorAuthentication/issues/3 or https://github.com/neos/Neos.EventSourcing/issues/249 It was not an issue for injections that were not typehinted via PHP, e.g. @Flow\Inject instead of setter/constructor injection.
This change fixes that retrospectively, by always reflecting the actual class name that is specified in the typehint and hence allowing usage of class_alias.
Thanks a lot @alcaeus for helping me figure this out!