mirror of
https://github.com/twigphp/Twig.git
synced 2026-09-07 07:57:01 +00:00
adds support for invoking closures
This commit is contained in:
committed by
Fabien Potencier
parent
77376c9302
commit
0a61801d9a
@@ -2,6 +2,7 @@
|
||||
|
||||
* Fix the null coalescing operator when the test returns null
|
||||
* Fix the Elvis operator when used as '? :' instead of '?:'
|
||||
* Support for invoking closures
|
||||
|
||||
# 3.17.0 (2024-12-10)
|
||||
|
||||
|
||||
@@ -1740,6 +1740,10 @@ final class CoreExtension extends AbstractExtension
|
||||
|
||||
static $propertyCheckers = [];
|
||||
|
||||
if ($object instanceof \Closure && '__invoke' === $item) {
|
||||
return $isDefinedTest ? true : $object();
|
||||
}
|
||||
|
||||
if (isset($object->$item)
|
||||
|| ($propertyCheckers[$object::class][$item] ??= self::getPropertyChecker($object::class, $item))($object, $item)
|
||||
) {
|
||||
@@ -1777,6 +1781,9 @@ final class CoreExtension extends AbstractExtension
|
||||
// precedence: getXxx() > isXxx() > hasXxx()
|
||||
if (!isset($cache[$class])) {
|
||||
$methods = get_class_methods($object);
|
||||
if ($object instanceof \Closure) {
|
||||
$methods[] = '__invoke';
|
||||
}
|
||||
sort($methods);
|
||||
$lcMethods = array_map('strtolower', $methods);
|
||||
$classCache = [];
|
||||
|
||||
@@ -394,6 +394,10 @@ class TemplateTest extends TestCase
|
||||
[true, ['foo' => 'bar'], $arrayAccess, 'vars', [], $anyType],
|
||||
]);
|
||||
|
||||
// test for Closure::__invoke()
|
||||
$tests[] = [true, 'closure called', fn (): string => 'closure called', '__invoke', [], $anyType];
|
||||
$tests[] = [true, 'closure called', fn (): string => 'closure called', '__invoke', [], $methodType];
|
||||
|
||||
// tests when input is not an array or object
|
||||
$tests = array_merge($tests, [
|
||||
[false, null, 42, 'a', [], $anyType, 'Impossible to access an attribute ("a") on a int variable ("42") in "index.twig".'],
|
||||
|
||||
Reference in New Issue
Block a user