Přidávání callbacků do životního cyklu aplikace pomocí DI
- Jan Jakeš
- Člen | 177
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
$container->getDefinition('application')
->addSetup('$service->onStartup[] = ?;', array(array('@service', 'method')));
- danik
- Člen | 56
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
Co takto?
services:
user:
setup:
- "$service->onLoggedIn[] = ?;"([@service, 'method'])
- Aearsis
- Člen | 57
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)
- Aearsis
- Člen | 57
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.