Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Array unpacking (spread operator) #810

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

s2b
Copy link
Contributor

@s2b s2b commented Jul 5, 2023

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}

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
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}
@NamelessCoder
Copy link
Member

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: #396 - achieved without modifying the built-in parser split expressions.

@s2b s2b marked this pull request as draft October 16, 2023 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants