Getter::$ignore internals
-
Cette variable statique est posée à
true
à chaque appel à Data_Link::write(), le temps de l’écriture de l’objet utilisant le lien de donnée.Elle est vérifier dans les méthodes du Mappeur Getter, pour que la lecture dynamique d’objets liées depuis le lien de données ne s’effectue pas pendant l’écriture.
C’est lié à l’implémentation standard de l’algorithme d’écriture standard adoptée dans la méthode write() des liens de données.
Les raisons :
- L’écriture est conçue pour écrire tous les objets liés qui ont été ouverts, donc potentiellement modifiés.
Par exemple si on a ouvert une commande et modifié les lignes (qui sont en Collection),$order->lines
est ouvert et modifié, l’écriture va donc stocker chaque ligne au cas où elle ait été modifiée.
A contrario si on a ouvert une commande sans toucher aux lignes,$order->lines
est resté fermé et ne sera pas écrit par la fonction d’écriture, économisant ainsi des opérations inutiles.
Sans leGetter::$ignore = true
, les lignes seraient ouvertes pendant l’écriture, et on ne ferait plus la différence entre lignes potentiellement modifiées et lignes dont on est sûr qu’elles n’aient pas été modifiées.
- La même explication convient également pour les objets liés en Map, comme par exemple les commerciaux liés à une commande
$order->salesmen
. On ne va pas réenregistrer des liens vers objets tiers s’ils n’ont pas été ouverts avant l’appel à write().
- Par contre pour les objets liés simples, ils ne sont de toutes les façons enregistrés que s’il s’agit de nouveaux objets (donc sans id). Si l’objet a un id et donc existe déjà, il n’est pas réenregistré, dans tous les cas. Le
Getter::$ignore = true
ne change donc pas le comportement en écriture dans ce cas. Il permet simplement d’éviter la lecture inutile par le lien de données d’un objet lié, apportant tout de même un gain de performance.
Il s’agit donc principalement d’optimiser le traitement d’écriture pour aider le Dao à décider seul de quelles données il doit écrire, et pour éviter au maximum qu’il ne fasse des écritures inutiles.
Le processus est actuellement imparfait :
- Une collection ou une map d’objets liés sera forcément réécrite s’il a été consultée avant l’appel à write(), même si aucune modification n’a été apportée. L’optimisation est donc incomplète.
- Plus grave : à ce jour (07/05/2015) si une propriété dont on va sauvegarder la valeur utilise un getter implicite d’objet lié, il ne sera pas appliqué, provoquant une récupération de donnée incorrecte. Cas observé ce jour sur l’ERP pour l’écriture d’un Client qui a une adresse multi-lines provoquant le renseignement automatique de sa propriété
$address
à partir des lignes d’adresses, du code postal et de la ville, ce dernier objet devant être lu pour que$address
soit renseigné convenablement. Dans ce cas métier précis le problème est fictif puisse qu’on ne stocke en principe pas ces données avec l’adresse, mais si ça avait été le cas on aurait eu une valeur fausse dans$address
.
- L’écriture est conçue pour écrire tous les objets liés qui ont été ouverts, donc potentiellement modifiés.