Po přechodu z 2.2 na 2.3 nefunguje „injectEnabler“ extension
- Jan Mikeš
- Člen | 771
Ahoj, mám napsanou jednoduchou extension, pro všechny generované továrničky automaticky přepla inject na true.
<?php
namespace App\InjectEnabler;
use Nette\Configurator,
Nette\DI\Compiler,
Nette\DI\CompilerExtension;
if (!class_exists('Nette\DI\CompilerExtension')) {
class_alias('Nette\Config\Compiler', 'Nette\DI\Compiler');
class_alias('Nette\Config\Configurator', 'Nette\Configurator');
class_alias('Nette\Config\CompilerExtension', 'Nette\DI\CompilerExtension');
}
final class Extension extends CompilerExtension
{
const EXTENSION_NAME = "injectEnabler";
public function beforeCompile()
{
$builder = $this->getContainerBuilder();
foreach ($builder->definitions as $definition) {
if ($definition->implement && method_exists($definition->implement, 'create')) {
$definition->setInject(TRUE);
}
}
}
public function install(Configurator $configurator)
{
$self = $this;
$configurator->onCompile[] = function ($configurator, Compiler $compiler) use ($self) {
$compiler->addExtension($self::EXTENSION_NAME, $self);
};
}
}
Po přechodu z 2.2 na 2.3 ale bohužel se žádné inject metody v komponentách nevolají, pokud továrničce ručne v configu nastavim inject: true pak vše funguje.
Nenapadá někoho, v čem je BC break?
Trochu jsem testoval a žádná z mých továrniček není obsahem
$builder->definitions, totiž když odstraním podmínku
if ($definition->implement && method_exists($definition->implement, 'create'))
,
mělo by to zapnout pro všechny služby, tak se ale nestane a i přesto mé
továrničky nemají inject zapnutý.
Předem díky za všechny nápady.
- Filip Procházka
- Moderator | 4668
V 2.3 můžeš použít DecoratorExtension
decorator:
Nette\Application\UI\Control:
inject: on
- Šaman
- Člen | 2665
Filip Procházka napsal(a):
V 2.3 můžeš použít DecoratorExtension
decorator: Nette\Application\UI\Control: inject: on
Je o tom někde nějaké info v dokumentaci? Resp. chápu to dobře tak, že si mohu hromadně pro všechny instance a potomky nějaké třídy/rozhraní zapnout injectování, nebo třeba nasettit jim ručně nějakou nepovinnou závislost? Jestli ano, tak super, to mi dlouho chybělo.
- Jan Mikeš
- Člen | 771
Díky za info, také jsem se dočetl v changelogu, že byla přidána InjectExtension ale více jsem zatím nezjišťoval, zkusím řešení od @FilipProcházka protože vypadá dost sexy!