doctrine / orm

Doctrine Object Relational Mapper (ORM)
https://www.doctrine-project.org/projects/orm.html
MIT License
9.86k stars 2.5k forks source link

Unintercepted function call to load entity data when `enable_lazy_ghost_objects` is enabled #11524

Open jbcr opened 6 days ago

jbcr commented 6 days ago

Bug Report

Q A
BC Break yes
Version 2.15.5

Summary

When the option enable_lazy_ghost_objects is enabled, calling a function not getter/setter on an entity can break the code.

Current behavior

An entity used from relation (with proxy) can execute function code without entity data. You need to explicitly call a property to load the entity data.

How to reproduce

I'm upgrading a project from Sylius 1.12 to 1.13.2.

During the upgrade, I have set the enable_lazy_ghost_objects to true to remove deprecation.

But, if enable_lazy_ghost_objects is true I have an error when I try to access Sylius Ressource translation from a relation.

In Sylius, you have an entity (resource) named Product that can be translated (ProductTranslation). On the Product, I have a method called getTanslation(?string $local = null) to get the current translation or requested translation by $local parameter. This method throws an exception if the current local and the $local parameter are null.

I added a new entity (resource) named Tag with a one-to-many relation to Product.

When I execute $tag->getFirstProduct()->getTranslation()->getName(); the exception is thrown because the product is not loaded.

Expected behavior

The data of Product entity must be loaded when getTranslation() is called.

Source issue: https://github.com/doctrine/DoctrineBundle/issues/1809

Sylius Issue: https://github.com/Sylius/Sylius/issues/16462