From 32a75b7869ede17c43c572c0b15cb6b2bb33f80c Mon Sep 17 00:00:00 2001 From: Gregor Harlan Date: Thu, 5 Dec 2024 12:31:45 +0100 Subject: [PATCH] Fix ArrayAccess with objects as keys --- src/Extension/CoreExtension.php | 2 +- tests/Fixtures/expressions/array.test | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index a693d947e8c..567c7e6771f 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -1644,7 +1644,7 @@ public static function getAttribute(Environment $env, Source $source, $object, $ // array if (Template::METHOD_CALL !== $type) { - $arrayItem = \is_bool($item) || \is_float($item) ? (int) $item : $item = (string) $item; + $arrayItem = \is_bool($item) || \is_float($item) ? (int) $item : $item; if ($sandboxed && $object instanceof \ArrayAccess && !\in_array($object::class, self::ARRAY_LIKE_CLASSES, true)) { try { diff --git a/tests/Fixtures/expressions/array.test b/tests/Fixtures/expressions/array.test index 1de76e93ee2..7d1c3b0adad 100644 --- a/tests/Fixtures/expressions/array.test +++ b/tests/Fixtures/expressions/array.test @@ -42,12 +42,19 @@ Twig supports array notation {# ArrayAccess #} {{ array_access['a'] }} +{# ObjectStorage #} +{{ object_storage[object] }} +{{ object_storage[object_storage]|default('bar') }} + {# array that does not exist #} {{ does_not_exist[0]|default('ok') }} {{ does_not_exist[0].does_not_exist_either|default('ok') }} {{ does_not_exist[0]['does_not_exist_either']|default('ok') }} --DATA-- -return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' => 'b'])] +$objectStorage = new SplObjectStorage(); +$object = new stdClass(); +$objectStorage[$object] = 'foo'; +return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' => 'b']), 'object_storage' => $objectStorage, 'object' => $object] --EXPECT-- 1,2 foo,bar @@ -71,11 +78,14 @@ a,b,c,d,e b +foo +bar + ok ok ok --DATA-- -return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' => 'b'])] +return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' => 'b']), 'object' => new stdClass()] --CONFIG-- return ['strict_variables' => false] --EXPECT-- @@ -101,6 +111,9 @@ a,b,c,d,e b + +bar + ok ok ok