Fluid icon indicating copy to clipboard operation
Fluid copied to clipboard

[FEATURE] Array unpacking (spread operator)

Open s2b opened this issue 2 years ago • 1 comments

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}

s2b avatar Jul 05 '23 21:07 s2b

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.

NamelessCoder avatar Aug 16 '23 12:08 NamelessCoder