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
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
No tak to už vôbec nechápem. Prečo sa robí tá serializácia?
Karel N
Profil *
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
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
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
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 *
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 *
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: