[FEATURE] Array unpacking (spread operator)
This change adds unpacking to Fluid’s array syntax, also known as the spread operator. Internally, it uses PHP’s own spread operator, so the behavior should be consistent between Fluid and PHP.
Example:
<f:variable name="array1" value="{key1: 'value1'}" />
<f:variable name="array2" value="{key2: 'value2'}" />
<f:variable name="combinedArray" value="{...array1, ...array2, anotherKey: 'another value'}" />
Result:
{key1: 'value1', key2: 'value2', anotherKey: 'another value'}
Note that this change does not cover dynamic ViewHelper arguments. This means that you can only use the spread operator in normal array contexts, but not for arguments in inline ViewHelper syntax. This is currently not possible because then ViewHelper arguments could then only be validated at runtime rather than parsetime, which is where validation currently happens for performance reasons.
Because of similarities between object accessor and array definition syntax, there is an edge case where Fluid wrongly chooses object accessor instead of array syntax. This only happens if the array syntax is used without any spaces at the beginning and only with a single spread operator. This case shouldn’t be relevant for real-world usage because it only creates a copy of the original array.
This edge case results in null:
{...input1}
These variants work fine:
{ ...input1}
{ ...input1 }
{...input1, ...input2}
{key: value, ...input1}
Array combinations would be better handled with a union type operation:
<v:h arrray="{arr1 + arr2}" />
This ability is already suggested in an open PR: https://github.com/TYPO3/Fluid/pull/396 - achieved without modifying the built-in parser split expressions.