Pořadí definice extensions

baraja
Člen | 26
+
0
-

Ahoj,

vždycky mě zajímalo, jestli existuje v Nette nějaký způsob, jak můžu jako autor DI extensions ovlivnit, v jakém pořadí se budou jednotlivá rozšíření kompilovat a případně jak zkontrolovat, že se pořadí kompiluje správně.

Podle pozorování to nyní funguje pravděpodobně tak, že se nejprve zkompilují všechny výchozí rozšíření, které definuje samotné jádro Nette a poté se postupně kompilují uživatelská rozšíření v tom pořadí, v jakém jsou v poli po zamergování všech neonů do sebe.

Tento přístup dává vývojáři relativně velkou volnost, ale zároveň autorovi balíčku trochu komplikací.

  1. Jak například mohu zjistit, že nějaká extension už byla zaregistrována?
  2. Existuje způsob, jak vytvořit závislost na službě z jiné extensions tak, aby se provedla i když se extensions vyhodnotí ve špatném pořadí?
  3. Může extensions o sobě říct, že musí být vyhodnocena až po nějaké jiné a případně si pořadí Nette samo v paměti prohodí?

Zejména třetí otázka by přinesla řešení řady složitých situací. Například v extension pro Doctrine definuji řadu obecných služeb, nicméně rád bych v dalších extensions (které jsou na Doctrine závislé) přidal nějaké setup parametry a podobně. Pokud se ovšem extensions zaregistrují ve špatném pořadí, tak aplikace selže.

Uživatel balíků závislosti podle názvů extensions nutně nezná, proto neví, jak moc si může dovolit jejich pořadí prohodit. Správnost totiž pozná pravděpodobně jenom podle vyhozené výjimky po selhané kompilaci.

Budu moc rád za všechny nápady, hodně by to pomohlo.

Díky moc!

Mistrfilda
Backer | 67
+
+1
-

Ahoj,

Nejsem úplně expert na složité DI extensions :D ale v poslední době jsem na problém s pořadím registrace extension v configu také narazil. Bylo to u nettrine balíčků, kdy jsem prohodil registraci pár služeb, trvalo mi chvilku než jsem to zdebugoval – dopsalo se to pak i do readme projektu zde https://github.com/…cs/README.md#… – to mi přijde jako jedna z cest. Použít jednoduše readme projektu, kde na to uživatele upozornit.

Druhá věc, co mě nepadá, je napsat jednu velkou extension, která by nahradila ty malé. Úplně jsem toto řešení nezkoumal, ale tipuji, že by se tam asi dalo hledat, jestli je nějaký balíček nainstalovaný a na základě toho, určit v jakém pořadí jednotlivé extension zaregistrovat – na toto téma jsem našel toto např. https://forum.nette.org/…lerextension

Felix
Nette Core | 1046
+
+2
-

@baraja @Mistrfilda Poradi CompilerExtension uz mame naplanovane, viz blogpost na blogu.