Dependency Injection a volanie service v bootstrap

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

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
+
0
-

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. :)

bazo
Člen | 620
+
0
-

diky, funguje. to s tymi roznymi containermi a configuratormi je dost zamotane :)

bojovyletoun
Člen | 667
+
0
-

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
+
0
-

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
+
0
-

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)