Vlastnosti objektu a lazy loading rubrika: Programování: PHP
Potřeboval bych poradit s řešením lazy loadingu dat do objektu, pokud ty data potřebuju už uvnitř objektu.
Mám databázový model. Do entity načítám data přes nějaký mapper který může nebo nemusí být nastaven (je nastaven pokud pracuji s entitou již existující v DB, není nastaven pokud vytvářím nový objekt entity, který teprve budu ukládat do DB). Tento mapper se stará o líné načítání hodnot. Zjednodušeně ta třídat vypadá nějak takto:
class Entity { // nemusí být nastaven, fungování mapperu nejde měnit! private $dataMapper; private $property1, $property2; // tohle je ve skutečnosti mnohem složitější, řídí se to anotacemi, vytváří vazby mezi entitamipříklad $book->author === BookEntity => AuthorEntity public function &__get($key) { if( $this->$key === null && isset(this->dataMapper) ) $this->$key = $this->dataMapper->$key; return $this->$key; } }
Potud dobrý. Problém je, že všechny property jsou nastaveny na null pokud se nezavolají přes magický __get($key)
. Tzn pokud mám ve třídě metodu třeba getProperty1State()
která vrací třeba textovou hodnotu na základě nějakého integeru v databázi, tak to musím teď napsat takhle blbě
class Entity { ... public function getPropertyState() { if( $this->__get('property') == 1 ) return 'Ano'; else return 'Ne'; } ... }
Samozřejmě bych měl raději místo $this->__get('property')
klasické $this->property
nebo něco podobného.
Podobné problémy má každý, kdo si píše vlastní ORM :). Doporučuju zkusit Doctrine a mít víceméně po starostech, anebo se pustit do složité implementace vracení potomků entit, které mají tyhle metody vygenerované.
Pro zobrazení všech 6 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře