getter – lazy vytvoření privátní instance
- StiFF.cz
- Člen | 8
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
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.