this->model dotaz z quickstartu

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

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..?

Majkl578
Moderator | 1364
+
0
-

Nemusí to vědět Nette, měl by to vědět programátor.
Tohle je problém neznalosti PHP, ne Nette. :)

odin
Člen | 50
+
0
-

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
+
0
-

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í.

Mesiah
Člen | 240
+
0
-

Jak se prosím Vás zachová Nette/Object (PHP), když budu mít abstraktní třídu, z ní bude dědit více potomků a každý potomek bude mít implementovánu, třeba zmíněnou metodu findAllTodos(..), a zavolám $this->model->findAllTodos(..) ??

Majkl578
Moderator | 1364
+
0
-

Je to Nette\Object (jde o jmenný prostor).
Postup volání metody findAllTodos(..):

  1. $this->model->findAllTodos(..)
  2. Volá se metoda Nette\Object::__get
  3. Volá se statická metoda Nette\ObjectMixin::get
  4. Volá se metoda $this->getModel() (jejíž alias byl $this->model)
  5. 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
+
0
-

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
+
0
-

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
+
0
-

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.

Mesiah
Člen | 240
+
0
-

aha, uz je mi to jasny, vubec jsem si to nespojil, kdyz jsem to cetl… diky!

PJK
Člen | 70
+
0
-

Majkl578 napsal(a):

Nemusí to vědět Nette, měl by to vědět programátor.
Tohle je problém neznalosti PHP, ne Nette. :)

To je projeb – neznat PHP a proto používat nějaký framework :D