[FEATURE] Proper support of local variables in ViewHelpers #828
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In its current implementation, the
f:alias
ViewHelper has side effects: It adds variables to the global variable container, which are not restored properly after the ViewHelper call. If a variable name is used as alias which already exists, that variable is unset after the ViewHelper call.To resolve this, a new
ScopedVariableProvider
is introduced to handle local variablesinside ViewHelper calls properly. After the local scope, global variables are restored to their original value in case they existed. At the same time, other modifications to the variable provider inside the
f:alias
call, such as a call tof:variable
, should still be persistent after the ViewHelper call. This ensures that the change is non-breaking for the vast majority of usages. The only situation where this could be breaking is when you relied on the arguably broken behavior thatf:alias
unsets the variables afterwards.This is also the reason why we can't simple store and reset the whole variable container. This would be a breaking change and would also be a diversion from other ViewHelpers, such as
f:if
, wheref:variable
also leaks out. To change this behavior for select ViewHelpers would be inconsistent and hard to understand for users of Fluid.before:
after:
This behavior also applies to other ViewHelpers that provide variables to their child nodes, such as
f:for
,f:render
,f:groupedFor
,f:cycle
. These will be modified accordingly in separate PRs.Resolves #666