From df86e30e6bfad8564f58728198ed451909dc6074 Mon Sep 17 00:00:00 2001 From: Marco Rieser Date: Sat, 28 Jun 2025 08:16:46 +0200 Subject: [PATCH] Handle non-public methods in PathDataManger --- .../Language/Runtime/PathDataManager.php | 4 ++- tests/Antlers/Runtime/DataRetrieverTest.php | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/View/Antlers/Language/Runtime/PathDataManager.php b/src/View/Antlers/Language/Runtime/PathDataManager.php index cec692806ea..776b95ac3d6 100644 --- a/src/View/Antlers/Language/Runtime/PathDataManager.php +++ b/src/View/Antlers/Language/Runtime/PathDataManager.php @@ -860,7 +860,9 @@ private function reduceVar($path, $processorData = []) } if (is_object($this->reducedVar) && method_exists($this->reducedVar, Str::camel($varPath))) { - $this->reducedVar = call_user_func_array([$this->reducedVar, Str::camel($varPath)], []); + $reflectionMethod = new \ReflectionMethod($this->reducedVar, Str::camel($varPath)); + + $this->reducedVar = $reflectionMethod->isPublic() ? call_user_func_array([$this->reducedVar, Str::camel($varPath)], []) : null; $this->resolvedPath[] = '{method:'.$varPath.'}'; if ($doCompact) { diff --git a/tests/Antlers/Runtime/DataRetrieverTest.php b/tests/Antlers/Runtime/DataRetrieverTest.php index 851048b52d8..50a74c47db1 100644 --- a/tests/Antlers/Runtime/DataRetrieverTest.php +++ b/tests/Antlers/Runtime/DataRetrieverTest.php @@ -76,4 +76,38 @@ public function test_dynamic_keys_are_correctly_set() $value = $this->getPathValue('page[view:nested:nested1:nested2]', $data); $this->assertSame(12345, $value); } + + public function test_object_methods_are_retrieved() + { + $data = [ + 'view' => [ + 'object' => new class + { + public function publicMethod() + { + return 'Hello Public World!'; + } + + protected function protectedMethod() + { + return 'Hello Protected World!'; + } + + private function privateMethod() + { + return 'Hello Private World!'; + } + }, + ], + ]; + + $value = $this->getPathValue('view.object.public_method', $data); + $this->assertSame('Hello Public World!', $value); + + $value = $this->getPathValue('view.object.protected_method', $data); + $this->assertNull($value); + + $value = $this->getPathValue('view.object.private_method', $data); + $this->assertNull($value); + } }