getter – lazy vytvoření privátní instance

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
StiFF.cz
Člen | 8
+
0
-

Zdravím,
V Nette teprve začínám a snažím se pochopit základní souvislosti.
Zkouším vytvořit aplikaci, kde v modelu načtu obsah xml souboru do pole a dále po vytvoření instance tohoto modelu už bych chtěl pracovat jen s tímto polem, abych do toho nemusel tahat databáze a nebo pokaždé znovu načítat tentýž xml soubor.
Pochopil jsem, že pokud si v presenteru vytvořím následující proměnnou modelu

<?php
        // getter pro lecture (lazy)
        public function getLecture()
        {
            if(!isset($this->lecture))
                $this->lecture = new Lecture();

            return $this->lecture;
        }
?>

tak se mi vytvoří instance až když bude skutečně potřeba. Jenže ona se mi vytvoří pokaždé, i když se nacházím pořád na stejném presenteru. :(

Mohl by mi někdo poradit, jak řešit tento problém? Nebo jestli je nějaké lepší řešení, než načíst obsah xml do pole.

Díky za rady, s php a Nette teprve začínám, tak mě omluvte. ;)

Jan Endel
Člen | 1016
+
0
-

Tak teďka nevím, jestli si pokaždé představit tak, že na stejnou funkci se odvoláváš při jednom vykreslení stránky několikrát nebo tak, že po změně akce (změní se url) se soubor parsuje znova.

Pokud to mám chápat jako tu druhou možnost, tak je to omezení php, že po vykreslení stránky se všechny proměné mažou a při novém vytvoření se vykreslují znova, jedno z řešení je třebas přes session, které k nette mají popsanout příjemnou dokumentaci .

Pokud by ses pro ně rozhodl, asi bych to řešil nějak takto (rozparsování XML do pole, proč ne):

// getter pro lecture (lazy)
        public function getLecture()
        {
	    $sessionSection = $this->context->session->getSection('lecture');
            if(!isset($sessionSection->lecture))
                $sessionSection->lecture = new Lecture();

            return $sessionSection->lecture;
        }

protože takhle se ti ta instance Lecture vytvoří skutečně jen jednou v rámci jednoho požadavku.

StiFF.cz
Člen | 8
+
0
-

Díky moc, to jsem přesně potřeboval. Tak jdu pročíst ty sessions. :)

22
Člen | 1478
+
0
-

když už, tak nebylo by lepší použít cache?

Jan Endel
Člen | 1016
+
0
-

Taky mě to napadlo, to je jenom další z možností, a ta session mi přišla pro člověka co se snaží pochopit Nette základní souvislosti pochopitelnější.