From 562a8403fad13d04e503d2bb90f94ddedb64ac6a Mon Sep 17 00:00:00 2001 From: Rik Bruil Date: Tue, 21 Nov 2017 14:37:16 +0100 Subject: [PATCH 1/3] Added extra test and test object for ClosureExpressionVisitor to match public methods literally --- .../ClosureExpressionVisitorTest.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php b/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php index 2bbf027d8..07a247062 100644 --- a/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php +++ b/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php @@ -267,6 +267,18 @@ public function testSortDelegate() : void self::assertEquals("c", $objects[2]->getBar()); } + public function testSortByLiteralPublicAccessor() + { + $objects = [new TestObjectWithLiteralPublicAccessor("a"), new TestObjectWithLiteralPublicAccessor("b"), new TestObjectWithLiteralPublicAccessor("c")]; + $sort = ClosureExpressionVisitor::sortByField("foo", 1); + + usort($objects, $sort); + + self::assertEquals("a", $objects[0]->foo()); + self::assertEquals("b", $objects[1]->foo()); + self::assertEquals("c", $objects[2]->foo()); + } + public function testArrayComparison() : void { $closure = $this->visitor->walkComparison($this->builder->eq("foo", 42)); @@ -362,6 +374,21 @@ public function getFooBar() : ?int } } +class TestObjectWithLiteralPublicAccessor +{ + private $foo; + + public function __construct($foo) + { + $this->foo = $foo; + } + + public function foo() + { + return $this->foo; + } +} + class TestObjectBothPublic { public $foo_bar; From 4147fb11bf7275073150a9770e7aed976642a697 Mon Sep 17 00:00:00 2001 From: Rik Bruil Date: Tue, 21 Nov 2017 14:38:16 +0100 Subject: [PATCH 2/3] Added extra check to ClosureExpressionVisitor before falling back to property access --- .../Common/Collections/Expr/ClosureExpressionVisitor.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php b/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php index 0d48b5bb8..923f6cb19 100644 --- a/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php +++ b/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php @@ -89,6 +89,10 @@ public static function getObjectFieldValue($object, $field) return $object->$accessor(); } + if (method_exists($object, $field)) { + return $object->$field(); + } + return $object->$field; } From 92601c439797b4917eb31a26fdb7aacb39501c89 Mon Sep 17 00:00:00 2001 From: Rik Bruil Date: Fri, 23 Mar 2018 22:56:24 +0100 Subject: [PATCH 3/3] Fixed test to comply with code style --- .../Collections/ClosureExpressionVisitorTest.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php b/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php index 911179580..162dc664a 100644 --- a/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php +++ b/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php @@ -250,14 +250,14 @@ public function testSortDelegate() : void public function testSortByLiteralPublicAccessor() { - $objects = [new TestObjectWithLiteralPublicAccessor("a"), new TestObjectWithLiteralPublicAccessor("b"), new TestObjectWithLiteralPublicAccessor("c")]; - $sort = ClosureExpressionVisitor::sortByField("foo", 1); + $objects = [new TestObjectWithLiteralPublicAccessor('a'), new TestObjectWithLiteralPublicAccessor('b'), new TestObjectWithLiteralPublicAccessor('c')]; + $sort = ClosureExpressionVisitor::sortByField('foo', 1); usort($objects, $sort); - self::assertEquals("a", $objects[0]->foo()); - self::assertEquals("b", $objects[1]->foo()); - self::assertEquals("c", $objects[2]->foo()); + self::assertEquals('a', $objects[0]->foo()); + self::assertEquals('b', $objects[1]->foo()); + self::assertEquals('c', $objects[2]->foo()); } public function testArrayComparison() : void @@ -371,9 +371,10 @@ public function getFooBar() : ?int class TestObjectWithLiteralPublicAccessor { + /** @var mixed */ private $foo; - public function __construct($foo) + public function __construct($foo = null) { $this->foo = $foo; }