Configurator – nahrazeni sluzby

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

Ahoj. Rad bych pozadal o pomoc. Uspesne jsem zmigroval na 2.3. V bootstrap souboru inicializuju configurator:

$configurator = new Nette\Configurator();
$container = $configurator->createContainer();

Ve separatnich extensions (PHP soubor) definuji sluzbu:

$container->addDefinition('myservice')
	->setClass('service\MyService');

Dale v bootstrap souboru dle hodnoty REQUESTURI kontroluji, zda-li pruchod timto souborem neni soucasti REST pozadavku a pokud ano, chci v kontejneru sluzbu nafejkovat, ponevadz prave behem REST pozadavku nepotrebuji spustit komplexni logiku sluzby MyService:

if ($isRest()) {
	$container->addService('myservice', new FakeService()); // namespace \service\FakeService
}

Pri zpracovani REST pozadavku se vsak generuje error hlaska, ze byla ocekavana sluzba \service\MyService namisto \service\FakeService.

Ve verzi 2.2 se prave uvedena chyba negenerovala. Jde toto ve 2.3 nejak elegantne vyresit? Myslel jsem si, ze vyvolani chyby by mohla potlacit skutecnost, ze MyService a FakeService implementuji spolecne rozhrani a mozna proto to ve 2.2 fungovalo, avsak ve 2.3 jiz nikoliv.

Editoval DavidTheNewbie (25. 2. 2017 13:40)

CZechBoY
Člen | 3608
+
0
-

Já bych tohle asi neřešil změnou služby, ale voláním správné služby už v presenteru. Můžeš taky si do presenteru poslat jinak nastavenou službu (jiný závislosti) než v jiným presenteru. Nebo nějaký parametr…

DavidTheNewbie
Člen | 79
+
0
-

CZechBoY napsal(a):

Já bych tohle asi neřešil změnou služby, ale voláním správné služby už v presenteru. Můžeš taky si do presenteru poslat jinak nastavenou službu (jiný závislosti) než v jiným presenteru. Nebo nějaký parametr…

To by si z me strany vyzadalo vetsi refaktoring. Spise by mne zajimala varianta, ktera tuto chybu ve 2.2 negenerovala. Mozna to bylo diky tomu spolecnemu rozhrani o rozdilnych sluzeb, anebo necim jinym. Toto se vsak ocividne ve 2.3 zmenilo.

Editoval DavidTheNewbie (26. 2. 2017 12:35)

David Matějka
Moderator | 6445
+
+1
-

staci:

$container->addDefinition('myservice')
	->setClass('service\FooInterface')
    ->setFactory('service\MyService');