Predanie presenteru do služby

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

Ahojte, riešim problem, že potrebujem dostať presenter do služby. Štandardná cesta je službe „injektnúť“ presenter v startup metóde (aspon o nicom inom neviem). Čo sa mi nepáči, lebo je to hodne málo blbovzdorné.

Tak som rozmýšlal inak, predám si teda do mojej služby „application“ a zaregistrujem si udalost na event onResponse(iba tam je presenter dostupný), a tu vznika moj problem. Sluzba je komponenta (ma tam nejake handle metody) a je to nejaky „panel“ do debuggeru, v ktorej potrebujem zachytavat signaly, takze onResponse je neskoro, kedže spracovani signálov už prebehlo. Potrebujem pristupovat k presenteru pred vykonanim requestu, co by sa dalo docielit prehodením jedného riadku v Application.php:

$this->requests[] = $request;
// tu sa vytvori presenter
$this->presenter = $this->presenterFactory->createPresenter($request->getPresenterName());
// a v onRequest uz je dostupny, registrujem si teda tu moju debugger-komponentu do presentera
// aby bolo mozne zachytit handle
$this->onRequest($this, $request);
// a tu sa spracuje presenter...
$response = $this->presenter->run($request);

a v mojej sluzbe potom:

	public function injectApplication(\Nette\Application\Application $application) {
		$application->onRequest[] = $this->onApplicationRequest;
	}

	public function onApplicationRequest(\Nette\Application\Application $application) {
		if($this->presenter) $this->presenter->removeComponent ($this->getId ());
		$this->presenter = $application->getPresenter();
		$this->presenter->addComponent($this, $this->getId());
	}

Napadá niekoho lepšie riešenie, kde by nebolo nutné písať kod do startup metody presentera?

David Matějka
Moderator | 6445
+
0
-

nevim, co s tim chces delat, ale nevystacis si s Nette\Application\Request? ze bys to jen navazal na onRequest v aplikaci. jinak bych to asi nechal v te startup metode v nejakym base presenteru.
jeste me napada jedno reseni a to zdedit Nette\Application\PresenterFactory, pridat si udalost onCreatePresenter a prepsat createPresenter, ktera zavola parent a spusti event. ten presenter factory potom registrujes jako sluzbu misto defaultniho presenter factory (sluzba nette.presenterFactory)

Morlok
Člen | 26
+
0
-

Diki, za tip, vyzera to ze to tak bude fungovat. Neuvedomil som si, ze si mozem registrovat vlastny presenterFactory.

Edit: tak nakoniec to nefachalo tak akosom si predstavoal, bol tam problem s parametrami, cistejsie to bolo dat do startup.

Editoval Morlok (16. 7. 2013 9:46)

Filip Procházka
Moderator | 4668
+
0
-

Pokud chceš používat události, popřemýšlej o Kdyby/Events (český článek)