Closed
Description
Symfony version(s) affected
7.3
Description
The TypeInfo component seems to be unable to parse a Doctrine\ORM\PersistentCollection
object when using doctrine/orm v2. I am seeing the following exception thrown when attempting to validate an object with a PersistentCollection as a property:
In StringTypeResolver.php line 88:
[Symfony\Component\TypeInfo\Exception\UnsupportedException]
Cannot resolve "array{cache?: array, cascade: array<string>, declared?: class-string, fetch: mixed, fieldName: string, id?: bool, inherited?: class-string, indexBy?: string, inversedBy: (string | null), isCascadeRemove: bool, isCascadePersist: bool
, isCascadeRefresh: bool, isCascadeMerge: bool, isCascadeDetach: bool, isOnDeleteCascade?: bool, isOwningSide: bool, joinColumns?: array<JoinColumnData>, joinColumnFieldNames?: array<string, string>, joinTable?: array, joinTableColumns?: list<mixed
>, mappedBy: (string | null), orderBy?: array, originalClass?: class-string, originalField?: string, orphanRemoval?: bool, relationToSourceKeyColumns?: array, relationToTargetKeyColumns?: array, sourceEntity: class-string, sourceToTargetKeyColumns?
: array<string, string>, targetEntity: class-string, targetToSourceKeyColumns?: array<string, string>, type: int, unique?: bool}".
Exception trace:
at /app/my_project/vendor/symfony/type-info/TypeResolver/StringTypeResolver.php:88
Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->resolve() at /app/my_project/vendor/symfony/type-info/TypeContext/TypeContextFactory.php:207
Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases() at /app/my_project/vendor/symfony/type-info/TypeContext/TypeContextFactory.php:74
Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName() at /app/my_project/vendor/symfony/type-info/TypeContext/TypeContextFactory.php:217
Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases() at /app/my_project/vendor/symfony/type-info/TypeContext/TypeContextFactory.php:74
Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName() at /app/my_project/vendor/symfony/property-info/Extractor/PhpStanExtractor.php:209
Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor->getType() at /app/my_project/vendor/symfony/property-info/PropertyInfoExtractor.php:70
Symfony\Component\PropertyInfo\PropertyInfoExtractor->getType() at /app/my_project/vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php:193
Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->getPropertyTypes() at /app/my_project/vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php:70
Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->loadClassMetadata() at /app/my_project/vendor/symfony/validator/Mapping/Loader/LoaderChain.php:48
Symfony\Component\Validator\Mapping\Loader\LoaderChain->loadClassMetadata() at /app/my_project/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php:96
Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory->getMetadataFor() at /app/my_project/vendor/symfony/validator/Validator/RecursiveContextualValidator.php:290
Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject() at /app/my_project/vendor/symfony/validator/Validator/RecursiveContextualValidator.php:126
Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate() at /app/my_project/vendor/symfony/validator/Validator/RecursiveValidator.php:81
Symfony\Component\Validator\Validator\RecursiveValidator->validate() at /app/my_project/vendor/symfony/validator/Validator/TraceableValidator.php:58
Symfony\Component\Validator\Validator\TraceableValidator->validate() at /app/my_project/src/Command/ValidateCommand.php:30
How to reproduce
Run the following commands to create a new project:
symfony new --webapp my_project
cd my_project
composer require doctrine/orm:2.20.3 -W
bin/console make:command app:validate
Update the ValidateCommand as follows:
<?php
namespace App\Command;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\PersistentCollection;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
#[AsCommand(name: 'app:validate')]
class ValidateCommand extends Command
{
public function __construct(
private readonly ValidatorInterface $validator,
private readonly EntityManagerInterface $entityManager
)
{
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$persistentCollection = new PersistentCollection($this->entityManager, new ClassMetadata(''), new ArrayCollection());
$this->validator->validate($persistentCollection);
return Command::SUCCESS;
}
}
Run the following:
bin/console app:validate
And see this error:
In StringTypeResolver.php line 88:
Cannot resolve "array{cache?: array, cascade: array<string>, declared?: class-string, fetch: mixed, fieldName: string, id?: bool, inherited?: class-string, indexBy?: string, inversedBy: (string | null), isCascadeRemove: bool, isCascadePersist: bool
, isCascadeRefresh: bool, isCascadeMerge: bool, isCascadeDetach: bool, isOnDeleteCascade?: bool, isOwningSide: bool, joinColumns?: array<JoinColumnData>, joinColumnFieldNames?: array<string, string>, joinTable?: array, joinTableColumns?: list<mixed
>, mappedBy: (string | null), orderBy?: array, originalClass?: class-string, originalField?: string, orphanRemoval?: bool, relationToSourceKeyColumns?: array, relationToTargetKeyColumns?: array, sourceEntity: class-string, sourceToTargetKeyColumns?
: array<string, string>, targetEntity: class-string, targetToSourceKeyColumns?: array<string, string>, type: int, unique?: bool}".
In StringTypeResolver.php line 295:
Unhandled "JoinColumnData" identifier.
app:validate
Possible Solution
No response
Additional Context
No response