Skip to content

Commit 0d95f41

Browse files
committed
bug symfony#48489 [DoctrineBridge] Skip resolving entities when the corresponding request attribute is already an object (nicolas-grekas)
This PR was merged into the 6.2 branch. Discussion ---------- [DoctrineBridge] Skip resolving entities when the corresponding request attribute is already an object | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix symfony#48433 | License | MIT | Doc PR | - Commits ------- 9b0d717 [DoctrineBridge] Skip resolving entities when the corresponding request attribute is already an object
2 parents bec0b5c + 9b0d717 commit 0d95f41

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,13 @@ public function __construct(
4040

4141
public function resolve(Request $request, ArgumentMetadata $argument): array
4242
{
43-
$options = $this->getMapEntityAttribute($argument);
43+
if (\is_object($request->attributes->get($argument->getName()))) {
44+
return [];
45+
}
46+
47+
$options = $argument->getAttributes(MapEntity::class, ArgumentMetadata::IS_INSTANCEOF);
48+
$options = ($options[0] ?? $this->defaults)->withDefaults($this->defaults, $argument->getType());
49+
4450
if (!$options->class || $options->disabled) {
4551
return [];
4652
}
@@ -201,12 +207,4 @@ private function findViaExpression(ObjectManager $manager, Request $request, Map
201207
return null;
202208
}
203209
}
204-
205-
private function getMapEntityAttribute(ArgumentMetadata $argument): MapEntity
206-
{
207-
/** @var MapEntity $options */
208-
$options = $argument->getAttributes(MapEntity::class, ArgumentMetadata::IS_INSTANCEOF)[0] ?? $this->defaults;
209-
210-
return $options->withDefaults($this->defaults, $argument->getType());
211-
}
212210
}

src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,20 @@ public function testExpressionSyntaxErrorThrowsException()
373373
$resolver->resolve($request, $argument);
374374
}
375375

376+
public function testAlreadyResolved()
377+
{
378+
$manager = $this->getMockBuilder(ObjectManager::class)->getMock();
379+
$registry = $this->createRegistry($manager);
380+
$resolver = new EntityValueResolver($registry);
381+
382+
$request = new Request();
383+
$request->attributes->set('arg', new \stdClass());
384+
385+
$argument = $this->createArgument('stdClass', name: 'arg');
386+
387+
$this->assertSame([], $resolver->resolve($request, $argument));
388+
}
389+
376390
private function createArgument(string $class = null, MapEntity $entity = null, string $name = 'arg', bool $isNullable = false): ArgumentMetadata
377391
{
378392
return new ArgumentMetadata($name, $class ?? \stdClass::class, false, false, null, $isNullable, $entity ? [$entity] : []);

0 commit comments

Comments
 (0)