Použití SearchExtension s Decoratorem

johnny13
Člen | 17
+
0
-

Ahoj,
mým cílem v projektu (běžícím na Nette 3 s verzí DI 3.0.3) je mít automaticky načítané některé (je jich asi většina) služby pomocí SearchExtension. Každá taková služba dědí od Base*** (např. od BaseControl nebo BaseEntityRepository) a všechny tyto Base*** obsahují settry, do niž vkládá závislosti Decorator, tedy klasický případ. Nicméně řeším problém, že decorator v kombinaci se SearchEntension nic do těchto settrů nevloží a závislosti (jako např. EntityManager apod.) jsou null. Za mě je to hrozná škoda, jelikož to pak ubírá hrozně na potenciálu SearchExtension. Zde bych poprosil o radu, co se s tím dá dělat a zda už existuje nějaké funkční řešení. Po přečtení pull requestu, který je na toto téma vydaný, jsem si lokálně ve vendoru v Compileru upravil proměnnou $last v metodě „processExtensions“ na $last = $this->getExtensions(Extensions\DecoratorExtension::class) + $this->getExtensions(Extensions\InjectExtension::class); a dekorování automaticky načítaných služeb se rozběhlo. Ale neexistuje nějaké nové lepší řešení? Přikládám pro jistotu i konfiguraci (config.neon) se search a decorator sekcemi.

<?php
search:
	-
		in: %appDir%/DashboardModule/Components
		classes:
			- *Factory
	-
		in: %appDir%/SignModule/Components
		classes:
			- *Factory
	-
		in: %appDir%/Model/Repository
		extends: App\Model\Repository\BaseEntityRepository

decorator:
	App\Model\UI\BaseControl:
		setup:
			- setTranslator
			- setContainer
			- setEntityManager
			- setCacheStorage
			- setUserStorage
	App\Model\Repository\BaseEntityRepository:
		setup:
			- setEntityManager
	App\Model\Security\BaseAuthenticator:
		setup:
			- setUser
			- setEntityManager
?>
MajklNajt
Člen | 487
+
0
-

IMHO je najvhodnejšie riešenie vyžadovať závislosti cez konštruktor, ak ich tam máš veľa, treba popremýšľať nad refaktoringom…

johnny13
Člen | 17
+
0
-

@MajklNajt Děkuji za reakci. To ale asi nepomůže vyřešit můj problém, kdy mi dekorátor nedekoruje služby načtené search extension

MajklNajt
Člen | 487
+
0
-

@johnny13 nerieši, ale eliminuje potrebu používať decorator na inject závislostí :)

johnny13
Člen | 17
+
0
-

@MajklNajt Pak tedy nevím, proč dokumentace vede víceméně k tomu samému, co mám v configu v sekci decorator. Nicméně opravdu apeluji na to, že toto vlákno nemá za cíl zjišťovat, zda použití dekorátoru na závislosti je správné či ne, ale zjišťuje jak použít dekorátor v kombinaci se SearchExtension. Poprosil bych tedy další příspěvky mířeny spíše tímto směrem. Myslím, že to pomůže nejen mě, ale i dalším (minimálně těm, co se zajímají o stav zmiňovaného pull requestu). Předem mnohokrát děkuji.

David Grudl
Nette Core | 8205
+
0
-

V dev verzi by to mělo být opravené.

johnny13
Člen | 17
+
0
-

@DavidGrudl Omlouvám se, nevím zda něco nedělám špatně, ale stále mi dekorování služeb vyhledaných search extension nefunguje. DI mám ve verzi dev-master, tedy i se zmiňovaným fixem. Můj config je zobrazen v zde v prvním příspěvku. Pokud ale upravim řádek s proměnnou $last v processExtensions upravím na $last = $this->getExtensions(Extensions\InjectExtension::class) + $this->getExtensions(Extensions\DecoratorExtension::class); tak se vše rozběhne.

David Grudl
Nette Core | 8205
+
0
-

@johnny13 můžu tě poprosit o nějaký minimální příklad, třeba na webprojectu? Nejsem schopen chybné chování nasimulovat.

F.Vesely
Člen | 369
+
+1
-

@DavidGrudl Jelikož s tím mám také problém, tak jsem vytvořil příklad https://github.com/…orExtensions

David Grudl
Nette Core | 8205
+
+3
-

@FVesely opraveno

johnny13
Člen | 17
+
0
-

@DavidGrudl Funguje, mockrát děkuji :)

F.Vesely
Člen | 369
+
0
-

@DavidGrudl Parada, dekuji moc. Mohl bych jeste poprosit o release, at nemusim pouzivat dev?