Webspire

Administrační systém

nw7 v3.6

V nové verzi nw7 balíčku byly kompletně zrefaktorovány tzv. "kontextové závislé resolvery".

Byl proveden významný refaktoring kontextově závislých továren a resolverů služeb.

Původních 4 implementace abstraktních předků:

  • AbstractContextDependantServiceResolver,
  • AbstractContextDependantFactoryServiceResolver,
  • AbstractLangDependantServiceResolver a
  • AbstractLangDependantFactoryServiceResolver)

byly nahrazeny jedním společným abstraktním předkem - ContextDependantServiceResolver a jedním potomkem v podobě ConfigurableContextDependentServiceResolveru, který - jak už název napovídá - je do značné míry konfigurovatelný (skrz setup/parametry konstruktoru) a dokáže poměrně snadným a transparentním způsobem postihnout všechny ze 4 abstraktních tříd předešlé implementace.

Především byl odstraněn koncept jazykově závislých továren a resolverů, jelikož jazyk je v podstatě jen další možnost jak vyjádřit určitý kontext. Předešlá implementace navíc trpěla jistými problémy, nejednoznačností (kontextové tovrány vs jazykové) a magií (ona magická create metoda v továrnách). Z důvodů magičnosti byl i koncept kontextových továren zavrhnut. Nyní je z důvodů typové kontroly, transparentnosti a lepší orientace v kódu doporučeno používat pouze kontextové resolvery služeb (pro získání té správné služby = továrny), ale ono volání create(), které vytvoří např. instanci komponenty, by si už programátor měl vždy zavolat explicitně sám.

Byl také změně způsob, jakým se generují názvy dohledávaných služeb.
Nově to má na starost implementace rozhraní IServiceNamingConvention, která má za účel na základě "základního" názvu továrny a (volitelně) daného kontextu vrátit kontextovou variantu názvu.
Díky tomu je možné použít stejnou kontextovou továrnu na více místech, avšak pokaždé s jinou jmennou konvencí pojmenování služeb (např. v závislosti na nastavení modulu apod.)

Příklad použití ConfigurableContextDependentServiceResolveru:

menuItemUrlGeneratorResolver:
class: Inspire\NW7\Service\ConfigurableContextDependentServiceResolver
arguments:
- ['internal', 'external', 'empty']
- ...
- @maskBasedNamingConventionFactory::create('menuItem%sUrlGenerator')
- Inspire\NW7\Control\Menu\Service\Generator\IMenuItemUrlGenerator
setup:
- setAllowWithoutContext(false)

V příkladu výše definujeme kontextovou továrnu, které předáváme v prvním argumentu povolené kontexty, v 3. argumentu třídu implementující rozhraní IServiceNamingConvention (vytvořenou automaticky skrz předpřipravenou továrnu maskBasedNamingConventionFactory) a ve 4. volitelném parametru předáváme název třídy, které musí být všechny nalezené služby potomkem (jinak je vyhozena výjimka).
Následně pomocí setupu zakážeme nad službou fallback na dohledání výchozí bezkontextové služby, pokud by se nenašla její kontextová varianta. Tzn. nedovolujeme dohledat službu bez kontextu. V případě volání create() metody továrny je proto potřeba jí vždy předat v prvním argumentu aktuální kontext, pro nějž chci dohledat službu.

 

Příklad 2.:

orderLangDependentDefaultNumberGeneratorFactory:
class: Inspire\NW7\Service\ConfigurableContextDependentServiceResolver
arguments:
- @allowedLangsConfigProvider::getAllowedLangs()
- ...
- @maskBasedNamingConventionFactory::create('orderDefaultNumberGenerator%sFactory')
setup:
- setContextResolver(@langContextResolver)

V příkladu 2. je vidět podobná situace jako v prvním příkladu, avšak kotext je nyní jazyk (demo náhrady za jazykově závislé továrny). Povolené konexty (jazyky) zde vstupují jako výsledek volání (předpřipravené) služby allowedLangsConfigProvider, kontext je předáván skrz implementaci rozhraní IContextResolver v podobě předpřipravené služby langContextResolver která vrací kontext (kód) aktuálního jazyka.

 

 

###message