From db05d4cdba3ad961b1bd06b3c0a303c63626d9fe Mon Sep 17 00:00:00 2001 From: MatTheCat Date: Wed, 10 Aug 2022 14:14:37 +0200 Subject: [PATCH] [DoctrineBridge] Do not ignore null IDs in EntityValueResolver --- .../ArgumentResolver/EntityValueResolver.php | 4 +-- .../EntityValueResolverTest.php | 26 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php index 98f8150674154..cb0c2034982a6 100644 --- a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php +++ b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php @@ -74,7 +74,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable if (null === $object = $this->findViaExpression($class, $request, $options->expr, $options)) { $errorMessage = sprintf('The expression "%s" returned null', $options->expr); } - // find by identifier? + // find by identifier? } elseif (false === $object = $this->find($class, $request, $options, $name)) { // find by criteria if (false === $object = $this->findOneBy($class, $request, $options)) { @@ -123,7 +123,7 @@ private function find(string $class, Request $request, MapEntity $options, strin $id = $this->getIdentifier($request, $options, $name); if (false === $id || null === $id) { - return false; + return $id; } $objectManager = $this->getManager($options->objectManager, $class); diff --git a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php index 2dc6c0f731371..cfb010a00db05 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Bridge\Doctrine\Tests\ArgumentResolver; use Doctrine\DBAL\Types\ConversionException; @@ -214,6 +223,21 @@ public function testApplyWithId(string|int $id) $this->assertYieldEquals([$object], $ret); } + public function testApplyWithNullId() + { + $registry = $this->getMockBuilder(ManagerRegistry::class)->getMock(); + $converter = new EntityValueResolver($registry); + + $request = new Request(); + $request->attributes->set('id', null); + + $argument = $this->createArgument(isNullable: true); + + $ret = $converter->resolve($request, $argument); + + $this->assertYieldEquals([null], $ret); + } + public function testApplyWithConversionFailedException() { $registry = $this->getMockBuilder(ManagerRegistry::class)->getMock(); @@ -276,7 +300,7 @@ public function testApplyGuessOptional() $converter = new EntityValueResolver($registry); $request = new Request(); - $request->attributes->set('arg', null); + $request->attributes->set('guess', null); $argument = $this->createArgument('stdClass', new MapEntity(), 'arg', true);