this->model dotaz z quickstartu
- Mesiah
- Člen | 240
Zdravicko, prosim Vas, mam dotaz.
V quickstartu v oddílu Hezčí šablony je použit tento prikaz:
$this->template->todos = $this->model->findAllTodos($order = array(
'added' => 'ASC',
), $where = array(
'done' => $showDoneTasks ? 'yes' : 'no',
));
Ale neni mi jasné, jak může nette vědět, že v $this->model je
instance todoManagera ??
Může mi někdo objasnit, jak to funguje, nebo mě přesměrovat tak, kde je to
vysvětleno..?
- odin
- Člen | 50
Nette dela na tridach takovou magii, ze pokud chces cist vlastnost, ktera neni definovana zavola se odpovidajici getter (funkce, ktera ziska hodnotu teto vlastnosti). Tj:
tj. echo $this->model zavola automaticky metodu $this->getModel(), ktery vytvori (pokud je to potreba) instanci TodoManager a soucasne ji vrati.
Muj osobni nazor je, ze je to docela cerna magie, takze radsi model vytvarim pri inicializaci presneteru:
<?php
class TestPresenter extends BasePresenter {
private $model;
public function startup() {
parent::startup();
$this->model = new TestModel();
}
public function renderList() {
$this->model->cokoliv...
}
?>
- Majkl578
- Moderator | 1364
V tom případě se jedná o vlastnost Nette\Object. Magie to je, ale
často celkem příjemná. Jak to funguje se dozvíš v dokumentaci.
A to lazy instanciování je implementováno interně právě v getteru, při
prvním požadavku se vytvoří instance a ta se dále spravuje a vrací stejný
objekt při dalším volání.
- Majkl578
- Moderator | 1364
Je to Nette\Object (jde o jmenný prostor).
Postup volání metody findAllTodos(..):
- $this->model->findAllTodos(..)
- Volá se metoda Nette\Object::__get
- Volá se statická metoda Nette\ObjectMixin::get
- Volá se metoda $this->getModel() (jejíž alias byl $this->model)
- Volá se metoda findAllTodos(..)
Nette\Object vlastně nabízí jakýsi kompromis mezi objektovými vlastnostmi a gettery/settery. Voláš-li vlastnost (která je privátní a má getter), skrytě se volá getter, ale tobě to umožňuje volat jakoby přímo danou vlastnost.
- Mesiah
- Člen | 240
Děkuji, jenže jsem pochopil, že $this->model prohledává všechny modely a hledá v nich metodu findAllDotos(..), ale tak to asi neni…
Jak psal Odyn, nette pokud nenajde $this->getModel, tak vytvoří instanci TodoManager(a), jenže jak pozna, že má vytvoři instanci této třídy a ne jiné…? :O
Editoval Mesiah (12. 7. 2010 14:39)
- redhead
- Člen | 1313
To se ale neděje, pokud nenajde metodu getModel(), tak v tomto případě vyhodí výjimku, že nenašel třídní proměnnou $model (tak jako v normálním php), žádnou instanci vytvářet nebude.
// btw: chtělo by to do QS o této „magii“ něco napsat. Začátečníci to jen tak nepochopí..
Editoval redhead (12. 7. 2010 14:54)
- odin
- Člen | 50
Mesiah napsal(a):
Jak psal Odyn, nette pokud nenajde $this->getModel, tak vytvoří instanci TodoManager(a), jenže jak pozna, že má vytvoři instanci této třídy a ne jiné…? :O
nn, psal jsem, ze kdyz nette nenajde $this->model, tak zavola this->getModel() a metoda getModel() je v tom prikladu napsana takto:
<?php
public function getModel() {
if(!isset($this->todoManager))
$this->todoManager = new TodoManager;
return $this->todoManager;
}
?>
cili – vraci v kazdem pripade instanci tridy TodoManager.