Predanie presenteru do služby

- Morlok
 - Člen | 26
 
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
 
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)

- Filip Procházka
 - Moderator | 4668
 
Pokud chceš používat události, popřemýšlej o Kdyby/Events (český článek)