Injektnutí služeb do třídy rozšíření

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

Mám třídu rozšířění:

class MyExtension extends Nette\DI\CompilerExtension
{
	/** @var DependencyClass */
	private $dependencyClass;

	/**
	 * @param DependencyClass $dependencyClass
	 */
	public function __construct(DependencyClass $dependencyClass)
	{
		$this->dependencyClass = $dependencyClass;
	}

	public function loadConfiguration()
	{
		$this->dependencyClass->makeSomething();
	}

}

V config.neon mám zaregistrovanou jak službu DependencyClass, tak i rozšíření MyExtension:

services:
	dependencyClass: DependencyClass

extensions:
	myExtension: MyExtension(@dependencyClass)

Ale pokud to mám takt, tak mi Laděnka hlásí:

‚Argument 2 passed to Nette\DI\Compiler::addExtension() must be an instance of Nette\DI\CompilerExtension, instance of stdClass given, called in /path/to/my/application/vendor/nette/di/src/DI/Extensions/ExtensionsExtension.php on line 24 and defined‘.

David Matějka
Moderator | 6445
+
0
-

to nejde. sluzby jsou dostupne az po vytvoreni kontejneru

o co se konkretne snazis?

Editoval matej21 (25. 9. 2014 15:50)

Michal Vyšinský
Člen | 608
+
+1
-

Proč potřebuješ inject nějaké služby do extension?

Extension je „jen“ jakýsi registrátor na služby. Také jím lze upravovat DI kontejner. Metoda loadConfiguration se ale spouští pouze při překompilování kontejneru, takže by se ti stejně makeSomething nezavolalo pokaždé. Spíš nám řekni, čeho chceš dosáhnout. Určitě najdeme lepší řešení.

Btw. v době registrace extension ještě ani není kontejner k dispozici, takže inject ani nemůže fungvovat.