* 3.x:
use getShareDir as an indicator of Symfony version
Add 'invoke' to filters index
[Core] Fix cycle() with non-countable ArrayAccess+Traversable objects
Update .gitattributes to exclude phpstan configs
Bump version
Prepare the 3.22.1 release
Update CHANGELOG
`CoreExtension` : Make error message more readable
Add caution note for random function usage
Add throw tag to parse methods
This PR was squashed before being merged into the 3.x branch.
Discussion
----------
use getShareDir as an indicator of Symfony version
Proposal to fix#4719 , replaces #4721
Commits
-------
c4dcd0bb8c use getShareDir as an indicator of Symfony version
This PR was merged into the 3.x branch.
Discussion
----------
Add 'invoke' to filters index
Missing from https://github.com/twigphp/Twig/pull/4518 I think.
Commits
-------
f7daf71acc Add 'invoke' to filters index
This PR was merged into the 3.x branch.
Discussion
----------
Fix cycle() with non-countable ArrayAccess+Traversable objects
When using `cycle()` with an object that implements `\ArrayAccess` and `\Traversable` but is not `\Countable`, the function currently returns the object instance immediately after triggering the deprecation notice.
This prevents the value from being converted to an array, causing the cycle logic to fail or return the object itself.
This PR removes the early return to ensure `self::toArray()` is called, allowing these objects to be cycled correctly as expected.
**How to test**
```php
$seq = new class implements \ArrayAccess, \IteratorAggregate {
public function offsetExists($offset): bool { return true; }
public function offsetGet($offset): mixed { return 'val'; }
public function offsetSet($offset, $value): void {}
public function offsetUnset($offset): void {}
public function getIterator(): \Traversable { yield 'odd'; yield 'even'; }
};
// Should return 'odd', currently returns the $seq object
$result = CoreExtension::cycle($seq, 0);
```
Related to #4241
Commits
-------
473653d19b [Core] Fix cycle() with non-countable ArrayAccess+Traversable objects
This PR was merged into the 3.x branch.
Discussion
----------
Update .gitattributes to exclude phpstan configs
They where added in https://github.com/twigphp/Twig/pull/4458
Versions >= 3.16.0 have the not needed files
Commits
-------
2e0c874776 Update .gitattributes to exclude phpstan configs
This PR was squashed before being merged into the 3.x branch.
Discussion
----------
`CoreExtension` : Make error message more readable
It's a silly little patch, but really improves the readability of the error message IMO ...
Commits
-------
40248e4ca9 `CoreExtension` : Make error message more readable
This PR was merged into the 3.x branch.
Discussion
----------
Add throw tag to parse methods
Hi `@fabpot`, with PHPStan improving every day his exception checking, it's useful to have well documented method.
I didn't update all of them (there are too many), and focus on the one I have issue with:
- Almost all the InfixExpressionParserInterface/PrefixExpressionParserInterface implements throws a SyntaxError in parse method
- Parser::parse method is catching SyntaxError and rethrowing them so it should be added to the phpdoc
- Since Parser::parse catch Parser::subparse, it would be useful to add the phpdoc to subparse
Commits
-------
790eee7ae0 Add throw tag to parse methods
This PR was merged into the 3.x branch.
Discussion
----------
Add caution note for random function usage
See https://www.php.net/manual/en/function.array-rand.php and https://www.php.net/manual/en/function.mt-rand.php. Users should know that the Twig function is a convenience feature, but unusable e.g. for serious gaming/gambling apps due to the potential predictability and limited value range.
Commits
-------
02c5a4b0b6 Add caution note for random function usage
This PR was merged into the 3.x branch.
Discussion
----------
Allow Symfony 8 packages in Twig extra packages
I'm testing the upcoming Symfony 8 in some apps, and I have some issues with some Twig extra packages that don't allow installing Symfony 8 packages.
Commits
-------
9a8a1dc1dd Allow Symfony 8 packages in Twig extra packages
This PR was merged into the 3.x branch.
Discussion
----------
Fix array typehint for $variants in HtmlExtension
This PR corrects the array typehint for the `$variants` parameter in the `HtmlExtension::htmlCva` method. It was missing a closing angle bracket (`>`).
Commits
-------
64c87eeaa3 Fix array typehint for $variants in HtmlExtension
* 3.x:
Update CHANGELOG
Fix accessing arrays with stringable objects as key
Update inky_to_html.rst: Updating link
Update replace.rst
[Doc] Tweaks in the escaping article
Compile 'index' with repr (not string) in EmbedNode
Introduce registerUndefinedTestCallback
Fix intl test
Bump minimum Commonmark requirement
Support two words test guard
Bump version
Improve documentation examples for `enum` and `enum_cases`
Avoid errors when failing to guess the template info for an error
Add note to format_datetime explaining how to install required extensions
Fix compatibility layer
This PR was merged into the 3.x branch.
Discussion
----------
Fix accessing arrays with stringable objects as key
Fix#4701
Commits
-------
9ae75d315c Fix accessing arrays with stringable objects as key
This PR was merged into the 3.x branch.
Discussion
----------
[Doc] Tweaks in the escaping article
AS you can see in the redenred page (https://twig.symfony.com/doc/3.x/filters/escape.html) the tip about `html_attr` contains some uneeded line breaks.
This also tweaks another explanation to make it more clear.
Commits
-------
50327b5019 [Doc] Tweaks in the escaping article
This PR was merged into the 3.x branch.
Discussion
----------
Compile 'index' with repr (not string) in EmbedNode
Before this PR, the generated Template code had quotes around the index (integer) parameter value.
Commits
-------
e4d7915702 Compile 'index' with repr (not string) in EmbedNode
This PR was squashed before being merged into the 3.x branch.
Discussion
----------
Introduce registerUndefinedTestCallback
This is similar to `registerUndefinedFilterCallback` and `registerUndefinedFunctionCallback`
Commits
-------
cc12df995c Introduce registerUndefinedTestCallback
This PR was merged into the 3.x branch.
Discussion
----------
Fix intl test
Let's try to make it less fragile.
Commits
-------
41bfb6bd8b Fix intl test
This PR was merged into the 3.x branch.
Discussion
----------
Bump minimum Commonmark requirement
All previous versions have security issues
Commits
-------
8f970764e6 Bump minimum Commonmark requirement
This PR was squashed before being merged into the 3.x branch.
Discussion
----------
Support two words test guard
Extracted from https://github.com/twigphp/Twig/pull/4687
Commits
-------
30977bdea9 Support two words test guard
This PR was merged into the 3.x branch.
Discussion
----------
Improve documentation examples for `enum` and `enum_cases`
It may be obvious, but I first thought initializing an BackendEnum with a specific value could be possible with `enum(FQCN, value)`, but it does not, it always returns the first case instance (if exists).
Instead, `enum(FQCN).from(value)` must be used, and I think it's worth to improve `enum()` examples.
Commits
-------
def4abbd5e Improve documentation examples for `enum` and `enum_cases`
It may be obvious, but I first thought initializing an BackendEnum with a certain value could be possible with `enum(FQCN, value)`, but it does not, it always returns the first case instance (if exists).
Instead, `enum(FQCN).from(value)` must be used, I think it's worth to improve `enum()` examples.
This PR was merged into the 3.x branch.
Discussion
----------
Avoid errors when failing to guess the template info for an error
Someone reported on the Symfony Slack a case where they get a TypeError in `new \ReflectionObject($template)` in the guessing logic instead of seeing the original error they have (the one for which guessing was attempted), making it impossible to know the original error: https://symfony-devs.slack.com/archives/C01FN4EQNLX/p1756762972076319?thread_ts=1756753204.711889&cid=C01FN4EQNLX
I don't have a reproducer for that case (the original case involve a Symfony form theme, where the form renderer does weird usages of Twig which might lead to the backtrace not containing the expected template).
Not guessing the template file path and the original template line is better than breaking the error reporting.
Commits
-------
62747cee27 Avoid errors when failing to guess the template info for an error