-
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
Description
| Q | A |
|---|---|
| Bug report? | yes |
| Feature request? | no |
| BC Break report? | no |
| RFC? | no |
| Symfony version | 3.1.2 |
tl;dr
The UniqueEntityValidator makes the wrong assumption that Doctrine's ClassMetaData::getIdentifierValues() can only return scalars:
implode(', ', $class->getIdentifierValues($entity))
Therefore, it crashes when the returned identifiers are objects (associated entities).
Details
When the DoctrineBridge UniqueEntityValidator encounters a non unique value, it builds a constraint violation with it. In case this value is not castable to a string it tries to build one itself:
if (is_object($invalidValue) && !method_exists($invalidValue, '__toString')) {
$invalidValue = sprintf('Object of class "%s" identified by "%s"', get_class($entity), implode(', ', $class->getIdentifierValues($entity)));
}
If the entity's identifiers are associations (for example a Friendship entity with the two users as composite PK), $class->getIdentifierValues($entity) returns those entities. If they don't have any __toString() method either, the implode() function can't execute and it errors out with the following message:
Error: Object of class [...] could not be converted to string
Not sure what the complete value should be anyway. Recursing one level would produce a rather convoluted string...:
Object of class Acme\AppBundle\Entity\Friendship identified by object of class Acme\AppBundle\Entity\User identified by 123, object of class Acme\AppBundle\Entity\User identified by 456