diff --git a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php index ffff3006f7184..1efa7d78d0524 100644 --- a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php +++ b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php @@ -21,6 +21,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** @@ -68,7 +69,11 @@ public function resolve(Request $request, ArgumentMetadata $argument): array } elseif (false === $object = $this->find($manager, $request, $options, $argument)) { // find by criteria if (!$criteria = $this->getCriteria($request, $options, $manager, $argument)) { - return []; + if (!class_exists(NearMissValueResolverException::class)) { + return []; + } + + throw new NearMissValueResolverException(sprintf('Cannot find mapping for "%s": declare one using either the #[MapEntity] attribute or mapped route parameters.', $options->class)); } try { $object = $manager->getRepository($options->class)->findOneBy($criteria); @@ -185,7 +190,7 @@ private function getCriteria(Request $request, MapEntity $options, ObjectManager return $criteria; } elseif (null === $mapping) { - trigger_deprecation('symfony/doctrine-bridge', '7.1', 'Relying on auto-mapping for Doctrine entities is deprecated for argument $%s of "%s": declare the identifier using either the #[MapEntity] attribute or mapped route parameters.', $argument->getName(), method_exists($argument, 'getControllerName') ? $argument->getControllerName() : 'n/a'); + trigger_deprecation('symfony/doctrine-bridge', '7.1', 'Relying on auto-mapping for Doctrine entities is deprecated for argument $%s of "%s": declare the mapping using either the #[MapEntity] attribute or mapped route parameters.', $argument->getName(), method_exists($argument, 'getControllerName') ? $argument->getControllerName() : 'n/a'); $mapping = $request->attributes->keys(); } diff --git a/src/Symfony/Bridge/Doctrine/CHANGELOG.md b/src/Symfony/Bridge/Doctrine/CHANGELOG.md index fbd1055437d8f..3c660900e335f 100644 --- a/src/Symfony/Bridge/Doctrine/CHANGELOG.md +++ b/src/Symfony/Bridge/Doctrine/CHANGELOG.md @@ -7,6 +7,7 @@ CHANGELOG * Reset the manager registry using native lazy objects when applicable * Deprecate the `DoctrineExtractor::getTypes()` method, use `DoctrineExtractor::getType()` instead * Add support for `Symfony\Component\Clock\DatePoint` as `DatePointType` Doctrine type + * Improve exception message when `EntityValueResolver` gets no mapping information 7.2 --- diff --git a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php index 91ec5e89b99d3..8207317803857 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php @@ -24,6 +24,7 @@ use Symfony\Component\ExpressionLanguage\SyntaxError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class EntityValueResolverTest extends TestCase @@ -75,6 +76,11 @@ public function testResolveWithNoIdAndDataOptional() $request = new Request(); $argument = $this->createArgument(null, new MapEntity(), 'arg', true); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); } @@ -94,6 +100,11 @@ public function testResolveWithStripNulls() $manager->expects($this->never()) ->method('getRepository'); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); } @@ -262,6 +273,11 @@ public function testResolveGuessOptional() $manager->expects($this->never())->method('getRepository'); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); }