Registrácia služby iba ak služba daného typu nie je definovaná

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

Mám modul aplikácie ktorý rieši komplexne celú časť webu. Má to byť samostatný balík inštalovaný cez composer. Cieľom je, aby bol univerzálne použiteľný na rôznych weboch. Jeho súčasti musia byť v prípade potreby nahraditeľné špeciálnou implementáciu pre daný projekt.

Modul je registrovaný cez Extension. Chcem spraviť extension tak, aby boli služby automaticky registrované, iba v prípade, ak služba nie je definovaná v config.neon.
Žiaľ v loadConfiguration ešte nie sú zaregistrované služby z config.neon a v beforeCompile je na registráciu už neskoro – chýbajú pre injectovanie do presenterov.

class UserModuleExtension extends CompilerExtension
{
	public function loadConfiguration()
	{
		$builder = $this->getContainerBuilder();
		if ($sluzbaTohotoTypuNieJeNastavena)
			$builder->addDefinition($this->prefix('registrationFormFactory'))
				->setImplement('RM\UserModule\Application\UI\Control\RegistrationForm\IRegistrationFormFactory');
	}
}

Je to možné? Ako to riešite?

Vďaka!

David Matějka
Moderator | 6445
+
+1
-

Ja preferuju, ze to registruju vzdy a pak pripadne upravim v neonu nastaveni:

services:
	myExtension.registrationFormFactory: {implement: FooFormFactory}

pokud bys ale chtel resit podminecnou definici, tak v loadConfiguration muze byt prilis brzo. Asi bych na to sel tak, ze v loadConfiguration bych ji vzdy registroval a pak v beforeCompile zkontroloval, zda nepribyla nova definice a pokud ano, tak puvodni odebrat. Od 2.3 muzes ziskat v beforeCompile vsechny sluzby daneho typu metodou findByType

romiix.org
Člen | 343
+
0
-

Super, toto riešenie s nazvaním služby mi nejak nenapadlo:)

Podmienečné registrovanie je je v loadConfiguration priskoro a v beforeCompile v tomto prípade neskoro.
Ak si registrovanú službu injectujem v nejakom presentri, tak musí byť medzi loadConfiguration a beforeCompile dostupná presne jedna služba daného rozhrania. A to neviem docieliť.

Pre 100 % pohodlné vyriešenie tohoto problému v Nette chýba ešte nejaká metóda medzi loadConfiguration a beforeCompile.