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)