KnpLabs / DoctrineBehaviors

Doctrine2 behavior traits that help handling Blameable, Loggable, Sluggable, SoftDeletable, Uuidable, Timestampable, Translatable, Tree behavior
http://knplabs.com
MIT License
913 stars 293 forks source link

access locale and current locale don't "load" object #759

Open mpoiriert opened 7 months ago

mpoiriert commented 7 months ago

The default and current local of a translation is done via the "postLoad".

When have a proxy object the post load event is only triggered if we access a property that is not in the list of "$skippedProperties"

Accessing any property that are not in the orm (and id) will not trigger the post load event.

so this code:

protected function doTranslate(?string $locale = null, bool $fallbackToDefault = true): TranslationInterface
{
   if ($locale === null) {
     $locale = $this->getCurrentLocale();
    }

    // ...
}

Will always return 'en' on the first call if "translate" is the first method call (proxy will not get initialize).

Which is the wrong behavior.

I have not idea how to fix this properly since it's doctrine proxy factory that decide which proper to that should be skipped.

 while ($reflector) {
   foreach ($reflector->getProperties($filter) as $property) {
     $name = $property->name;

     if ($property->isStatic() || (($class->hasField($name) || $class->hasAssociation($name)) && ! isset($identifiers[$name]))) {
       continue;
     }

     $prefix = $property->isPrivate() ? "\0" . $property->class . "\0" : ($property->isProtected() ? "\0*\0" : '');

     $skippedProperties[$prefix . $name] = true;
   }

   $filter    = ReflectionProperty::IS_PRIVATE;
   $reflector = $reflector->getParentClass();
}
pdias commented 6 months ago

Any solution to this problem?

pdias commented 6 months ago

I have solved this using fetch EAGER in my entity relation:

#[ORM\ManyToOne(fetch: 'EAGER', targetEntity: Gender::class, inversedBy: 'staffs')]
#[ORM\JoinColumn(name: 'gender', referencedColumnName: 'id')]
private $gender;
bobvandevijver commented 3 months ago

See #767 for a fix.