Jak vytáhnout parametr z Configuratoru ještě před vytvořením containeru?

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

Ahoj,
dá se nějak vytáhnout parametr z Configuratoru a předat službě, kterou do něj následně podmíněně přidávám?

Konkrétně řeším odesílání mailů z CLI s generováním odkazů v mailech (podle tohoto návodu) a ráda bych měla předávané url pohodlně konfigurovatelné v config.local.neon.

V bootstrapu mám:

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

if(PHP_SAPI === 'cli'){
    // takhle nějak by se mi to líbilo:
//	$domainUrl = $configurator->getParameter('domainUrl');

    // takhle to zatím mám:
	$domainUrl = 'http://example.com/';
	$configurator->addServices([
		'http.request' => new Nette\Http\Request(new Nette\Http\UrlScript($domainUrl)),
	]);
}

$container = $configurator->createContainer();

Dá se to nějak hezky vyřešit?

Martk
Člen | 651
+
+1
-

Tak jak to chceš ty, tak to nepůjde, bez velké úpravy kódu. Konfigurační soubor se parsuje, až s voláním metody createContainer. Metoda addConfig uloží jen cestu k souboru do pole.

Jestli chceš mít dostupný parameter i v aplikaci, tak uděláš tohle:

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$configurator->addParameters([
	'domainUrl' => PHP_SAPI === 'cli' ? 'xxx' : NULL,
]);

$container = $configurator->createContainer();

V config.local.neon definuješ normálně službu, nový parameter by měl být pod %domainUrl%

chikeet
Člen | 160
+
0
-

Martk napsal(a):

Tak jak to chceš ty, tak to nepůjde, bez velké úpravy kódu. Konfigurační soubor se parsuje, až s voláním metody createContainer. Metoda addConfig uloží jen cestu k souboru do pole.

Jestli chceš mít dostupný parameter i v aplikaci, tak uděláš tohle:

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$configurator->addParameters([
	'domainUrl' => PHP_SAPI === 'cli' ? 'xxx' : NULL,
]);

$container = $configurator->createContainer();

V config.local.neon definuješ normálně službu, nový parameter by měl být pod %domainUrl%

Sice chci něco trošičku jiného (mít právě to domainUrl v configu), ale díky, nakoplo mě to správným směrem :-)

filsedla
Člen | 101
+
+1
-

Zrovna dneska jsem do bootstrapu napsal tohle:

...
$container = $configurator->createContainer();

if ($container->parameters['consoleMode']) {
    $container->removeService('httpRequest');
    $container->addService('httpRequest', new \Nette\Http\Request(
		new \Nette\Http\UrlScript($container->parameters['substituteRequestUrl'])));
}
matopeto
Člen | 395
+
0
-

filsedla napsal(a):

Zrovna dneska jsem do bootstrapu napsal tohle:

...
$container = $configurator->createContainer();

if ($container->parameters['consoleMode']) {
    $container->removeService('httpRequest');
    $container->addService('httpRequest', new \Nette\Http\Request(
		new \Nette\Http\UrlScript($container->parameters['substituteRequestUrl'])));
}

Hm… remove service by ma nenapadlo, nedavno som to potreboval… skusim :)

chikeet
Člen | 160
+
0
-

@filsedla Anoo, to je přesně ono, díky moc! :-)

Felix
Nette Core | 1183
+
+2
-

filsedla napsal(a):

Zrovna dneska jsem do bootstrapu napsal tohle:

...
$container = $configurator->createContainer();

if ($container->parameters['consoleMode']) {
    $container->removeService('httpRequest');
    $container->addService('httpRequest', new \Nette\Http\Request(
		new \Nette\Http\UrlScript($container->parameters['substituteRequestUrl'])));
}

Ja na tohle pouzivam rozsireni a funguje paradne.

https://github.com/…master/.docs#sapi

extensions:
    sapi: Contributte\Http\SAPI\DI\SapiRequestExtension(https://my-ultra-top.web)