Události zavěšené na presenterech

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

Lze nějakým způsobem pověsit události na presenter? Konkrétně mám modul pro ACL který není podmínkou aby v appce byl a proto bych rád přímo v něm řešil kontrolu oprávnění. Do BasePresenteru bych si pak hodil něco jako onCheckRequrements a tady na to by byl navěšen listener z ACL modulu. Vím že Kdyby/Events potřebují aby objekt na který se má pověsit událost byl jako služba, což už v nové verzi nette presentery jsou nebo se pletu?

Pavel Kravčík
Člen | 1196
+
0
-

Já si občas registruju presenter jako službu a tahám si do něj config parametry – takže ano mělo by to jít.

Tomáš Votruba
Moderator | 1114
+
0
-

Jasně. Zkoušel jsi to? Permissions můžeš kontrolovat třeba na onStartup().

akadlec
Člen | 1326
+
0
-

No zkoušel ale event se nezavolal. Nette ty presentery dělá jako služby samo nebo je potřeba ještě něco nastavit. Možná sem někde něco přehlédl.

Tomáš Votruba
Moderator | 1114
+
0
-

Aha, tak se omlouvám. Mrknul jsem na náš kód a přetěžujeme metodu checkRequirements().

Zřejmě z konvenčních důvodů.

K inspiraci:

// Our/Custom/BasePresenter.php

/**
 * @param PresenterComponentReflection|Method $element
 */
public function checkRequirements($element)
{
	if ($element instanceof PresenterComponentReflection) {
		$this->eventDispatcher->dispatch(
			ApplicationEvents::CHECK_REQUIREMENTS,
			new PresenterComponentReflectionEvent($element)
		);
	} elseif ($element instanceof Method) {
		$this->eventDispatcher->dispatch(
			ApplicationEvents::CHECK_METHOD_REQUIREMENTS,
			new MethodReflectionEvent($element)
		);
	}
}

Takže bych doporučil tento způsob. Případně registrovat presentery manuálně.

Editoval Tomáš Votruba (6. 11. 2015 9:53)

Oli
Člen | 1215
+
0
-

@akadlec mě to funguje úplně normálně. Od Nette 2.3 jsou presentery registrovaný automaticky (jak jsi psal). Pokud máš zaregistrovanej listener a $onSomething jako public, tak by to mělo fungovat. Vypisuju to hlavně proto, že se mě kolikrát stane, že na něco zapomenu (typicky public property)

akadlec
Člen | 1326
+
0
-

Takže stačí do presenteru udělat $onNeco, pak to zavolat tam kde chcu a Kdyby/Events to odpálí? Protože takto jsem to měl, viděl jsem to i v seznamu v laděnce, ale událost se nezavolala.

Asi ale problém sem měl v tom jak byla ta událost navěšena. Zřejmě bych musel vypsat všechny presentery že? Protože má být na všech.