Přidávání callbacků do životního cyklu aplikace pomocí DI

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

V poslední době se snažím psát addony pro Nette, které jsou založeny na DI a instalují se opravdu přidáním jen jediné řádky kódu do bootstrapu, nicméně občas narážím na komplikace, že nelze nastavit úplně vše, protože Nette poměrně nekonzistentně někde nabízí settery/gettery a jinde jsou naopak pouze public properties.

Je v současné době nějaká možnost, jak pomocí DI přidat nějaký callback například pro $application->onStartup[]? Jelikož v Application neexistuje metoda ve stylu addOnStartup($callback), nejsem v DI schopný zapsat něco jako:

$container->getDefinition('application')
	->addSetup('addOnStartup', array('some-callback'));

Nebo to jde jinak? Díky.

Filip Procházka
Moderator | 4668
+
0
-
$container->getDefinition('application')
        ->addSetup('$service->onStartup[] = ?;', array(array('@service', 'method')));
Jan Jakeš
Člen | 177
+
0
-

Díky díky. Nedošlo mi, že v addSetup můžeme psát PHP kód…

David Grudl
Nette Core | 8108
+
0
-

Lze, ale musí se tam uvést otazník. Trošku WTF.

danik
Člen | 56
+
0
-

ahoj vespolek,

resim obdobnej problem, chtel bych si neco zaregistrovat do @user->onLoggedIn a chtel bych to udelat v configu, ne v bootstrapu – a nedari se mi za zadnou cenu prijit na to, jak napodobit tenhle zapis v neonu… problem je, ze „setup“ parametr sluzby umi prijmout jedine stdclass (efektivne neon entity) nebo callable – a ja nevim jak donutit neon, aby mi z myho zapisu udelal neon entity… nekdo nejakej tip? :o) dik!

Filip Procházka
Moderator | 4668
+
0
-

Co takto?

services:
	user:
		setup:
			- "$service->onLoggedIn[] = ?;"([@service, 'method'])
danik
Člen | 56
+
0
-

Vau! Tak to je hodne wtf. Nejak me nenapadlo pouzit ten retezec tam kde bych cekal jmeno tridy :o) velmi dekuji!

Aearsis
Člen | 57
+
0
-

Ale tohle je vážně ošklivé.

user:
	- onLoggedIn[]([@service, 'method']) # Uvozovky by nemusely být potřeba,
	- onLoggedIn[] [@service, 'method']  # ani u properties nevím proč jsou.
	- onLoggedIn[] = [@service, 'method']# možná by šlo i tohle...
	$serviceDefinition->addSetup('onEvent[]', array(array('@service', 'method')));

Hrozí kolize? BC break? Já si žádného vědom nejsem. A implementace by taky složitá nebyla. A upřímně, toto by vývoji rozšíření dost pomohlo, zapojení čehokoli do životního cyklu aplikace je celkem běžná věc na to, aby se to dělalo přes podobné obludné konstrukce. #RFC

Editoval Aearsis (4. 8. 2012 23:24)

Filip Procházka
Moderator | 4668
+
0
-

Mně se to líbí. Pošli pull request :)

Aearsis
Člen | 57
+
0
-

Pokusím se. Pokud to teda nebylo myšleno jako „fuck yea“ :)

Aearsis
Člen | 57
+
0
-

nakonec jen jedna sytaxe jde bez větších zásáhů do parseru NEONu:

service:
	- $onEvent[]([@another, 'method'])
	$serviceDefinition->addSetup('$onEvent[]', array(array('@service', 'method')));

Na druhou stranu, alespoň je to stejné jako ostatní properties. Ve skutečnosti tento pull request umožňuje pushovat do libovolného pole.

Pull request