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 | 667
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)