Skip to content

[TypeInfo] DomainException: Unhandled "JoinColumnData" identifier #60700

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
umpirsky opened this issue Jun 5, 2025 · 2 comments
Closed

[TypeInfo] DomainException: Unhandled "JoinColumnData" identifier #60700

umpirsky opened this issue Jun 5, 2025 · 2 comments

Comments

@umpirsky
Copy link
Contributor

umpirsky commented Jun 5, 2025

Symfony version(s) affected

7.3.0

Description

This issue started happening after updating symfony/type-info (v7.2.5 => v7.3.0). Which makes sense given the changes added here.

DomainException: Unhandled "JoinColumnData" identifier. in vendor/symfony/type-info/TypeResolver/StringTypeResolver.php:297
Stack trace:
#0 vendor/symfony/type-info/TypeResolver/StringTypeResolver.php(185): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->resolveCustomIdentifier('JoinColumnData', Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#1 vendor/symfony/type-info/TypeResolver/StringTypeResolver.php(207): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->getTypeFromNode(Object(PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#2 [internal function]: Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->{closure:Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver::getTypeFromNode():207}(Object(PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode))
#3 vendor/symfony/type-info/TypeResolver/StringTypeResolver.php(207): array_map(Object(Closure), Array)
#4 vendor/symfony/type-info/TypeResolver/StringTypeResolver.php(110): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->getTypeFromNode(Object(PHPStan\PhpDocParser\Ast\Type\GenericTypeNode), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#5 vendor/symfony/type-info/TypeResolver/StringTypeResolver.php(86): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->getTypeFromNode(Object(PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#6 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(207): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->resolve('array{cache?: a...', Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#7 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(74): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases(Object(ReflectionClass), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#8 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(217): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName('Doctrine\\ORM\\Ma...')
#9 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(74): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases(Object(ReflectionClass), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#10 vendor/symfony/property-info/Extractor/PhpStanExtractor.php(209): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName('Doctrine\\ORM\\Pe...', 'Doctrine\\ORM\\Pe...')
#11 vendor/symfony/property-info/PropertyInfoExtractor.php(71): Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor->getType('Doctrine\\ORM\\Pe...', 'owner', Array)
#12 vendor/symfony/property-info/PropertyInfoCacheExtractor.php(87): Symfony\Component\PropertyInfo\PropertyInfoExtractor->getType('Doctrine\\ORM\\Pe...', 'owner', Array)
#13 vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php(202): Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor->getType('Doctrine\\ORM\\Pe...', 'owner')
#14 vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php(75): Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->getPropertyTypes('Doctrine\\ORM\\Pe...', 'owner')
#15 vendor/symfony/validator/Mapping/Loader/LoaderChain.php(48): Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->loadClassMetadata(Object(Symfony\Component\Validator\Mapping\ClassMetadata))
#16 vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php(96): Symfony\Component\Validator\Mapping\Loader\LoaderChain->loadClassMetadata(Object(Symfony\Component\Validator\Mapping\ClassMetadata))
#17 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(293): Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory->getMetadataFor(Object(Doctrine\ORM\PersistentCollection))
#18 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Doctrine\ORM\PersistentCollection), 'data.userGenera...', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#19 vendor/symfony/validator/Constraints/ValidValidator.php(36): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Doctrine\ORM\PersistentCollection), NULL, Array)
#20 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(750): Symfony\Component\Validator\Constraints\ValidValidator->validate(Object(Doctrine\ORM\PersistentCollection), Object(Symfony\Component\Validator\Constraints\Valid))
#21 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(595): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateInGroup(Object(Doctrine\ORM\PersistentCollection), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\PropertyMetadata), 'profile', Object(Symfony\Component\Validator\Context\ExecutionContext))
#22 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(508): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateGenericNode(Object(Doctrine\ORM\PersistentCollection), Object(Proxies\__CG__\Chess\WebBundle\Entity\User), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\PropertyMetadata), 'data.userGenera...', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#23 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(299): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateClassNode(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), 'data', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#24 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), 'data', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#25 vendor/symfony/form/Extension/Validator/Constraints/FormValidator.php(105): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), NULL, Array)
#26 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(750): Symfony\Component\Form\Extension\Validator\Constraints\FormValidator->validate(Object(Symfony\Component\Form\Form), Object(Symfony\Component\Form\Extension\Validator\Constraints\Form))
#27 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(483): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateInGroup(Object(Symfony\Component\Form\Form), '000000000001fcf...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), 'Default', Object(Symfony\Component\Validator\Context\ExecutionContext))
#28 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(299): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateClassNode(Object(Symfony\Component\Form\Form), '000000000001fcf...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), '', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#29 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Symfony\Component\Form\Form), '', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#30 vendor/symfony/validator/Validator/RecursiveValidator.php(81): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Symfony\Component\Form\Form), NULL, Array)
#31 vendor/symfony/form/Extension/Validator/EventListener/ValidationListener.php(43): Symfony\Component\Validator\Validator\RecursiveValidator->validate(Object(Symfony\Component\Form\Form))
#32 vendor/symfony/event-dispatcher/EventDispatcher.php(206): Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener->validateForm(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...', Object(Symfony\Component\EventDispatcher\EventDispatcher))
#33 vendor/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'form.post_submi...', Object(Symfony\Component\Form\Event\PostSubmitEvent))
#34 vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php(28): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...')
#35 vendor/symfony/form/Form.php(585): Symfony\Component\EventDispatcher\ImmutableEventDispatcher->dispatch(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...')


Next 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}". in vendor/symfony/type-info/TypeResolver/StringTypeResolver.php:90
Stack trace:
#0 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(207): Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver->resolve('array{cache?: a...', Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#1 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(74): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases(Object(ReflectionClass), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#2 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(217): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName('Doctrine\\ORM\\Ma...')
#3 vendor/symfony/type-info/TypeContext/TypeContextFactory.php(74): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->collectTypeAliases(Object(ReflectionClass), Object(Symfony\Component\TypeInfo\TypeContext\TypeContext))
#4 vendor/symfony/property-info/Extractor/PhpStanExtractor.php(209): Symfony\Component\TypeInfo\TypeContext\TypeContextFactory->createFromClassName('Doctrine\\ORM\\Pe...', 'Doctrine\\ORM\\Pe...')
#5 vendor/symfony/property-info/PropertyInfoExtractor.php(71): Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor->getType('Doctrine\\ORM\\Pe...', 'owner', Array)
#6 vendor/symfony/property-info/PropertyInfoCacheExtractor.php(87): Symfony\Component\PropertyInfo\PropertyInfoExtractor->getType('Doctrine\\ORM\\Pe...', 'owner', Array)
#7 vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php(202): Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor->getType('Doctrine\\ORM\\Pe...', 'owner')
#8 vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php(75): Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->getPropertyTypes('Doctrine\\ORM\\Pe...', 'owner')
#9 vendor/symfony/validator/Mapping/Loader/LoaderChain.php(48): Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader->loadClassMetadata(Object(Symfony\Component\Validator\Mapping\ClassMetadata))
#10 vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php(96): Symfony\Component\Validator\Mapping\Loader\LoaderChain->loadClassMetadata(Object(Symfony\Component\Validator\Mapping\ClassMetadata))
#11 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(293): Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory->getMetadataFor(Object(Doctrine\ORM\PersistentCollection))
#12 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Doctrine\ORM\PersistentCollection), 'data.userGenera...', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#13 vendor/symfony/validator/Constraints/ValidValidator.php(36): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Doctrine\ORM\PersistentCollection), NULL, Array)
#14 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(750): Symfony\Component\Validator\Constraints\ValidValidator->validate(Object(Doctrine\ORM\PersistentCollection), Object(Symfony\Component\Validator\Constraints\Valid))
#15 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(595): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateInGroup(Object(Doctrine\ORM\PersistentCollection), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\PropertyMetadata), 'profile', Object(Symfony\Component\Validator\Context\ExecutionContext))
#16 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(508): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateGenericNode(Object(Doctrine\ORM\PersistentCollection), Object(Proxies\__CG__\Chess\WebBundle\Entity\User), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\PropertyMetadata), 'data.userGenera...', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#17 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(299): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateClassNode(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), '000000000001e93...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), 'data', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#18 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), 'data', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#19 vendor/symfony/form/Extension/Validator/Constraints/FormValidator.php(105): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Proxies\__CG__\Chess\WebBundle\Entity\User), NULL, Array)
#20 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(750): Symfony\Component\Form\Extension\Validator\Constraints\FormValidator->validate(Object(Symfony\Component\Form\Form), Object(Symfony\Component\Form\Extension\Validator\Constraints\Form))
#21 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(483): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateInGroup(Object(Symfony\Component\Form\Form), '000000000001fcf...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), 'Default', Object(Symfony\Component\Validator\Context\ExecutionContext))
#22 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(299): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateClassNode(Object(Symfony\Component\Form\Form), '000000000001fcf...', Object(Symfony\Component\Validator\Mapping\ClassMetadata), '', Array, NULL, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#23 vendor/symfony/validator/Validator/RecursiveContextualValidator.php(129): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(Object(Symfony\Component\Form\Form), '', Array, 1, Object(Symfony\Component\Validator\Context\ExecutionContext))
#24 vendor/symfony/validator/Validator/RecursiveValidator.php(81): Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Symfony\Component\Form\Form), NULL, Array)
#25 vendor/symfony/form/Extension/Validator/EventListener/ValidationListener.php(43): Symfony\Component\Validator\Validator\RecursiveValidator->validate(Object(Symfony\Component\Form\Form))
#26 vendor/symfony/event-dispatcher/EventDispatcher.php(206): Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener->validateForm(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...', Object(Symfony\Component\EventDispatcher\EventDispatcher))
#27 vendor/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'form.post_submi...', Object(Symfony\Component\Form\Event\PostSubmitEvent))
#28 vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php(28): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...')
#29 vendor/symfony/form/Form.php(585): Symfony\Component\EventDispatcher\ImmutableEventDispatcher->dispatch(Object(Symfony\Component\Form\Event\PostSubmitEvent), 'form.post_submi...')

How to reproduce

Arguments that break PropertyInfoLoader are:

Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader::getPropertyTypes('Doctrine\ORM\PersistentCollection', 'owner')

doctrine/orm version is 2.20.0.

When I skip owner field, it works.

Possible Solution

No response

Additional Context

Field from which this is coming from is defined as OneToMany:

#[ORM\OneToMany(targetEntity: UserGeneratedContent::class, mappedBy: 'user', cascade: ['persist', 'remove'])]
protected Collection $userGeneratedContent;

ManyToOne:

#[ORM\Table(name: 'user_generated_content')]
class UserGeneratedContent
{
    #[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'user_id', columnDefinition: 'INT(10) UNSIGNED NOT NULL')]
    #[ORM\Id]
    #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'userGeneratedContent')]
    protected User $user;
@mtarld
Copy link
Contributor

mtarld commented Jun 5, 2025

Seems like it's a duplicate of #60598. It should be fixed in the next bugfix version 🙂

@javiereguiluz
Copy link
Member

Let's close this as a duplicate of #60598.

@javiereguiluz javiereguiluz closed this as not planned Won't fix, can't repro, duplicate, stale Jun 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants