Dependency Injection a volanie service v bootstrap

- bazo
 - Člen | 620
 
Zdravim,
mam definovany service v config.neon
services:
	EventManager:
		factory: \Tatami\Events\EventManager::Factory
potrebujem ho zavolat v bootstrap.php kde je naveseny na application->onStartup
<?php
$configurator = new Nette\Configurator;
$configurator->loadConfig(APP_DIR.'/config/config.neon');
$application = $configurator->container->application;
$application->onStartup[] = function(Nette\Application\Application $application)
{
    $router = $application->getRouter();
    $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
    $router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Tatami:dashboard:default');
    $application->getContext()->getService('EventManager')->fireEvent(Tatami\Events\Event::APPLICATION_STARTUP, &$application);
};
?>
pise mi error Service not found. Pritom ak chcem tento service ziskat v Presenteri, tak to funguje bez problemov.
Da sa toto nejak riesit? Ak som pouzival Environment tak nebol problem

- Tharos
 - Člen | 1030
 
Tam je problém ten, že pro Nette\Application\Application se vyrábí
nový DI\Container a předávají se do něj z toho „globálního“ (ve
kterém je továrnička na Tvou službu) pouze některé služby (a Tvá služba
není mezi nimi).
Řešil bych to tak, že bych řádek s „onStartup“ zapsal následovně:
$application->onStartup[] = function() use ($application, $configurator)
a pak namísto
$application->getContext()->getService('EventManager')
použil
$configurator->getContainer()->getService('EventManager').
Mělo by to fungovat. :)

- bojovyletoun
 - Člen | 668
 
Ono to logiku dává, (aplikace, presenter mají svůj Kontext), ale
konfigurátor je jako skladiště(kontejner) na služby(které tvoří kontext)
.
Jaký je důvod toho, že application má v contextu omezené množství
služeb?

- Jan Tvrdík
 - Nette guru | 2595
 
bojovyletoun wrote:
Jaký je důvod toho, že application má v contextu omezené množství služeb?
Víc jich nepotřebuje.

- Tharos
 - Člen | 1030
 
Důvod je ten, že více jich nepotřebuje. Správně by třídám mělo být injektováno jen to, co skutečně potřebují. A je-li závislostí málo a není vyžadováno lazy vytváření instancí „on demand“ a podobně, tak pak je ideální předat instance přímo přes konstruktor formou co instance, to parametr. Tj. bez použití DI containeru. K tomu se snaží navést taková ta teoretická poučka, že o existenci nějakého DI kontejneru by injektované třídy ideálně vůbec neměly vědět.
Editoval Tharos (9. 6. 2011 0:29)