Klonování Nette/Utils/ArrayHash

před 4 měsíci

Bajaja
Člen | 21
+
0
-

Ahoj,

zjistil jsem, ze mi v aplikaci dela bordel ArrayHash ktery ziskavam v success metode formulare. Hned na zacatku si ho naklonuju pro pozdejsi podminecne odeslani hodnot emailem.

<?php
$emailValues = clone $values;
?>

Dale zpracovavam data ve kterych je mimo jine vnorene dalsi ArrayHash s nazvem people. Ty si prochazim, ukladam do DB a doplnuji nejake dalsi informace.

<?php
foreach ($values->people as $person) {
    $person->event = $event;
    $person->company = $company;
}
?>

Poznamka: $event a $company jsou Doctrijni entity.

No a co se nestane po odeslani emailu s puvodnim ArrayHash $emailvalues? Spadne mi to na var_export does not handle circular references.

Zkousel jsem si tedy upravovat data $values a zjistil, ze ty se opravdu naklonovali a jakakoli uprava nema vliv na klon, ale pokud prochazim vnorene ArrayHash (people) a upravuju data tam, tak je upravuju i v klonu.

Tohle mi pripada jako bug. Nebo se mylim?

před 4 měsíci

CZechBoY
Člen | 2830
+
0
-

Asi máš jen mělkou kopii a ne hlubokou (se všemi zanořenými objekty).

Proč vlastně používáš ArrayHash a ne nějakou vlastní třídu přesně k tomuto use-case vytvořenou?
A taky proč klonuješ objekt? Je potřeba ten původní mít v nezměněné podobě?

před 4 měsíci

Bajaja
Člen | 21
+
0
-

Prave to je ten problem. PHPko nevytvori uplnou kopii. Pouze prvni uroven. To podle mne neni spravne.

Neni potreba predavat data jinam, jen je soupnu do process servicy a ta mi je doplni o vytvorene entity, ktere se mi zase pozdeji hodej jinde. Je to pouze prepravka, coz $values jsou.

Klonuju ho prave proto, ze si sobe posilam objednavku na email ve stylu

<?php
{php var_export($values)}
?>

Jenze ty entity maji reference ve smycce a ani je v emailu nepotrebuji. Takze si vsechna data naklonuju jeste pred dalsi praci s nimi…

před 4 měsíci

tatyalien
Člen | 235
+
0
-

Pokud nepotřebuješ array hash, tak si rovnou dej data z formuláře do pole… $form->getValues(TRUE)

před 4 měsíci

Bajaja
Člen | 21
+
0
-

Mne ani tak nejde o to jak tohle resit, ale poukazat na to, jestli je tohle spravne chovani ArrayHash. Podle mne neni.

před 10 dny

Pechy.cz
Člen | 10
+
+1
-

Správné chování ArrayHash to je, protože se tak chová clone v PHP normálně. A je blbost, aby se to tady chovalo jinak.

Jak je popsáno na stackoverflow tak řešením je např. DeepCopy