Autor | Zpráva | ||
---|---|---|---|
Camo Profil |
Dobrý večer všetkým,
prosím vás vie mi niekto vysvetliť ako funguje konštruktor v Doctrinovských entitách? Ak som to dobre pochopil, tak __construct() sa volá iba pri volaní napr. new Article(). a zase pri volaní napr. $this->entityManager->find('Article', $id); sa už konštruktor nevolá. Ako je to možné? To sa pri volaní find() vytvára inštancia nejakej inej triedy? Ako je možné obísť konštruktor? |
||
Karel N. Profil |
#2 · Zasláno: 7. 10. 2015, 21:46:27
v prvních verzích doctrine používali na vytvoření třídy unserialize, nejspíš tuhle obdobu evalu nezměnili. Doctrine už čtyři roky nepoužívám :)
tj. tohle vytvoří instanci třídy Article bez zavolání konstruktoru: $article = unserialize('O:7:"Article":0:{}'); |
||
Camo Profil |
#3 · Zasláno: 7. 10. 2015, 21:53:14
No tak to už vôbec nechápem. Prečo sa robí tá serializácia?
|
||
Karel N Profil * |
#4 · Zasláno: 7. 10. 2015, 22:12:14
díky tomu můžeš mít property v entitách private a nemít k tomu žádné settery. Oni serializaci nerobí, pouze si generují ten předpis pro unserializaci, kdoví ale jak je to teď, kdysi nám to dělalo problémy s opcache.
|
||
Camo Profil |
#5 · Zasláno: 7. 10. 2015, 22:41:21
No tak z toho som moc múdri neni. Ale díky za snahu.
Keby mal niekto lepšie vysvetlenie tak skúste. |
||
tiso Profil |
#6 · Zasláno: 7. 10. 2015, 23:06:18
Camo: ako to funguje si môžeš naštudovať sám, zdrojáky Doctrine sú na githube. Ja som sa v tom stratil.
|
||
Camo Profil |
#7 · Zasláno: 7. 10. 2015, 23:22:29
tiso:
Začal som s tým pred 3 dňami. Zdrojáky by mi mohli spôsobiť psychickú ujmu. Už aj tak pomaly neviem ako sa volám. |
||
Karel N Profil * |
#8 · Zasláno: 7. 10. 2015, 23:52:14
rada ať si to nastuduje sám není moc košér, v tom množství kód se ztratí i zkušený programátor.
Tady si vytvoří třídu (github): $serializedString = sprintf( '%s:%d:"%s":0:{}', $this->getSerializationFormat($reflectionClass), strlen($className), $className ); $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); return function () use ($serializedString) { return unserialize($serializedString); }; a tady do ní naplní hodnoty (github): foreach ($data as $field => $value) { if (isset($class->fieldMappings[$field])) { $class->reflFields[$field]->setValue($entity, $value); } } Kód obsahuje hodně větvení a cest jak třídu vytvořit je spousta, ale pro ukázku to asi dostačuje. Constructor v entitách nepoužívej, entita v doctrine je pouze obal nad daty, musí existovat jiné třidy, které s ní pracují a plní jí. PHP dost nevhodně pracuje s instancemi, doctrine si zvolila tuhle cestu, aby se výkonově aspoň dala nějak používat aby měli kontrolu nad entitami. |
||
Camo Profil |
Dobre nebudem sa tváriť, že chápem čo sa tam deje, ale aspoň približne snáď tuším.
Tak díky. |
||
smaley Profil * |
#10 · Zasláno: 8. 10. 2015, 09:25:40
Ja používam doctrine v kombinácií so symfony, pokúsim sa ti to vysvetliť teoreticky.
V podstate constructor sa vytvára pri zavolá ni entity a ja ho používam ak si potrebujem do entity niečo poslať. A čo sa týka funkcii find tak ta je defaultne vytvorená aby ti našla výsledky podľa ID. Podobne funkcie si môžeš vytvoriť v repozotary a následne ich volať v controllory. |
||
Camo Profil |
smaley:
No ale keď pristupuješ ku výsledku volania find() tak pristupuješ ku inštancii entity. Už to ale nechajme tak prosím. Chystám nové otázky. Doba temna sa prehlĺbila :) |
||
Časová prodleva: 9 let
|
0