Injektnutí služeb do třídy rozšíření
- fary
- Člen | 155
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
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
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.