Po přechodu z 2.2 na 2.3 nefunguje „injectEnabler“ extension

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

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
+
0
-

V 2.3 můžeš použít DecoratorExtension

decorator:
	Nette\Application\UI\Control:
		inject: on
Šaman
Člen | 2665
+
+2
-

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
+
0
-

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!

Filip Procházka
Moderator | 4668
+
+1
-

@Šaman přesně tak :)