7.3.3 (2022-04-04)

Overview of merged pull requests

BUGFIX: Prevent UriConstraints to generate invalid URIs

Adjusts UriConstraints::applyTo() such that it never creates an Uri instance with a path of / (which according to guzzle/psr was deprecated since 1.x and invalid with 2.x)

  • Fixes: #2473

  • Packages: Flow


The lock holding page was supposed to be customizable through an environment variable, but that never worked…

Now it does, using the new variable name FLOW_LOCK_HOLDING_PAGE as well as the (now deprecated) old name FLOW_LOCKHOLDINGPAGE.

  • Fixes: #2798

  • Packages: Flow

BUGFIX: Address deprecation warnings from PHP 8.1

The trim method did not like beeing called with a null argument when the FLOW_CONTEXT environment was not set.

` PHP Deprecated:  trim(): Passing null to parameter `#1 <https://github.com/neos/flow-development-collection/issues/1>`_($string) of type string is deprecated in /Users/ficzel/PhpStormProjects/neos-development-distribution-8-0/Packages/Framework/Neos.Flow/Scripts/flow.php on line 68 `

  • Packages: Flow

BUGFIX: LockManager catches PHP 8 Throwable during unlockSite

This is a followup PR to https://github.com/neos/flow-development-collection/pull/2716 to catch PHP 8 Throwables possibly thrown during @unlink($this->lockPathAndFilename);.

  • Packages: Flow Utility.ObjectHandling

BUGFIX: Show origin of yaml parse errors

Previously this was only done when pecl yaml parse was used which made it quite hard to find the defect yaml file when the Symfony yaml parser was used.

The change added the information about the currently parsed file to the exception message of symfony.

  • Packages: Flow

BUGFIX: Add behat @BeforeSuite and @AfterSuite to ignored annotation tags

What I did This adds the missing behat annotations to ignored tags, so behat tests using those hooks can be reflected.

How to verify it This is an example of the error that occurs currently when @BeforeSuite or @AfterSuite is used in any Behat Step class. !`image <https://user-images.githubusercontent.com/16836464/157476691-c5da169d-32d9-497f-b5ef-4806369a6600.png>`_ see also https://github.com/sandstorm/Sandstorm.E2ETestTools/pull/6 This can also be avoided when classes containing those annotations are not reflected, meaning if they are outside the psr classes directory. When they are inside psr class directories, an error is thrown (see screenshot)

BUGFIX: ArrayObjects are mapped correctly without PHP internal properties

Until now, ArrayObject``s would be mapped to array with a structure like this: ` array(4) {

[“arrayCopy”]=> array(1) {

[“foo”]=> string(3) “bar”

} [“flags”]=> int(0) [“iterator”]=> object(ArrayIterator)`#10459 <https://github.com/neos/flow-development-collection/issues/10459>`_(1) {

[“storage”:”ArrayIterator”:private]=> object(ArrayObject)`#10460 <https://github.com/neos/flow-development-collection/issues/10460>`_(1) {

[“storage”:”ArrayObject”:private]=> array(1) {

[“foo”]=> string(3) “bar”



} [“iteratorClass”]=> string(13) “ArrayIterator”


This is because getGettablePropertyNames() would return the internal properties which have matching public get* methods on the ArrayObject PHP class https://www.php.net/manual/en/class.arrayobject.php#arrayobject.synopsis

This adds an ArrayObjectConverter that allows to convert to a plain array containing only the intended custom properties. It uses getArrayCopy() to get the job done.

  • Fixes: #2041

  • Packages: Flow

BUGFIX: ObjectAccess with direct access on private properties of proxied classes

With this classes with private properties do react as expected to ObjectAccess::getProperty() and ObjectAccess::setProperty() with $forceDirectAccess enabled, even when they have been subclassed by the proxy building of Flow.

  • Fixes: #2388

  • Packages: Utility.ObjectHandling

BUGFIX: Prevent flush force error in production context

What I did

The flow:cache:flush --force command run’s Files::emptyDirectoryRecursively($environment->getPathToTemporaryDirectory()); which removes the lock file in the temporary directory too. The call to unlockSite() then causes a php warning because of the missing lock file ` Warning: unlink(/var/www/Data/Temporary/Production/SubContextDevelopment/cbe856ff790c9ba5208811309bdf168b_Flow.lock): No such file or directory in /var/www/Packages/Framework/Neos.Flow/Classes/Core/LockManager.php line 145 `

This PR just add’s a bit of error handling to the corresponding unlink of the lock file.

How to verify it

Run ./flow flow:cache:flush --force command in Production context.


Since this is a bugfix, I used branch 6.3. In case of FLOW 7, some php8 compatiblity was added which would change the PR to

try {


} catch (\Throwable $e) {

// PHP 8 apparently throws for unlink even with shutup operator, but we really don’t care at this place. It’s also the only way to handle this race-condition free.



Should I create another PR if this one is merged to get PHP 8 compatibility?

  • Packages: Flow

BUGFIX: Don’t use transactions to change db character set

BUGFIX: Fix PhpAnalyzer to support PHP 8

When running composer with PHP 8, the PhpAnalyzer did not work properly.

BUGFIX: Fix UriConstraints port constraints for default ports

Previously, if UriConstraints were applied to an URL with a non-default port (e.g. “8080”) this port constraint was applied to the target URL even if no explicit port constraint was set.

BUGFIX: Make Array.push accept `null for array type casting <https://github.com/neos/flow-development-collection/pull/2760>`_

related: https://github.com/neos/neos-development-collection/pull/3658 fixes: https://github.com/neos/neos-development-collection/issues/3657

  • Packages: Eel

BUGFIX: Avoid race condition on symlink publishing

If the symlink could not be created but exists, check if it points to the expected target and ignore the error in that case.

BUGFIX: Use configured pdo cache tables during flush and garbage collection

What I did

Without this patch using custom table names for the PDO cache backend would cause problems as some queries didn’t respect the given table names but used the defaults during DELETE operations. This has been adjusted.

How I did it

Use the configured table names as in all the other queries.

How to verify it

Use the backend with custom table names and try to flush them. Without the change an error would occur if the default tables have never been used and setup.

BUGFIX: Eel Helper `Array.push() auto cast string to array. #2710 <https://github.com/neos/flow-development-collection/pull/2733>`_

fixes #2710

same lose behaviour exists already for Array.concat()

  • Packages: Eel

BUGFIX: Properly encode error message in internal request header

According to the HTTP spec, characters like line breaks and some other are not allowed within a request header. Exception messages typically include those. Since guzzlehttp/psr7 1.8.4 it validates headers to this spec and makes our builds fail. This fixes that by base64 encoding the exception message we transfer via the X-Flow-ExceptionMessage header. Currently there is no code in the core that uses this header, but if you read this header at some obscure place, you need to base64_decode() the value first.

See https://github.com/guzzle/psr7/pull/486/files#diff-`fb174524a7bba27ce140bc6ccd1c30811a6abeed <https://github.com/neos/flow-development-collection/commit/fb174524a7bba27ce140bc6ccd1c30811a6abeed>`_9328e783b326189551ba7ed4R253

  • Packages: Flow

BUGFIX: Custom error view: skip ‘viewOptions’ that are ‘null’ #2738

fixes #2738

  • Packages: Flow

TASK: Tweak some @param annotations

For good measure… 🤷‍♂️

This doesn’t change anything, but it’s cleaner.

  • Packages: Flow

TASK: Add unit test (thanks @sorenmalling)

  • Related: #2626

  • Packages: Eel

TASK: Return 400 response if required argument is missing

When a required argument is missing request processing, the controller will return a response with a status code of 400, as that is caused by a bad request. The exception is logged with a notice to the log, to aid in debugging errors.

Previously the uncaught exception would cause a status 500 response and log a critical error.

Detailed log