68publishers / application

🌎 Easily setup different languages, currencies and countries
MIT License
3 stars 2 forks source link

Environment (profiles) and its detection #1

Open jelen07 opened 7 years ago

jelen07 commented 7 years ago

Cílem je napsat rozšíření, které z konfigurace načte nastavení prostředí a provede jeho detekci, nyní neon, později se bude možná generovat z db (FYI).

Možnosti

Ukázka konfigurace

environment:
    debugger: yes
    localeDomain: yes
    mode: progressive # Prozatím vynechat
    profiles:
        #default:
        #   country: [CZ, SK, GB, DE, PL]
        #   language: [cs_CZ, sk_SK, en_GB, pl_PL, de_DE]
        #   currency: [CZK, EUR, PLZ]
        czech:
            country: [CZ, SK]
            langauge: [cs_CZ, sk_SK]
            currency: [CZK, EUR]
            domain: [www.domain.local, domain.local]
        english:
            country: [GB, US]
            language: [en_GB, en_US]
            currency: [GBP, -USD]
            domain: [www.domain.local]
            disable: yes
        german:
            country: DE
            language: de_DE
            currency: EUR
            #domain: domain.local

Minimální konfigurace (by default) je tedy např.:

environment:
    profiles:
        default:
            country: CZ
            language: cs_CZ
            currency: CZK

Zvážit, zda-li výchozí konfigurace by neměla být nějaká spíše mezinárodního rázu ([CZ, US, GB], [cs_CZ, en_US], [USD, EUR, CZK]). Defaultní kombinace (nebude-li explicitně uvedeno jinak) bude použita pro CLI. Ta by měla být rozšířená o přepínač (profilu, příp. konkrétní kombinace). Toto ale ještě uvážit.

Progress

jelen07 commented 7 years ago

Věci které nejsou aktuálně prioritou nebo nejsou doposud jasné jsou přeškrknuty. Nějaký defaultní profil by by default asi neměl být. Zvážit tyto dvě možnosti:

  1. Buď při zaregistrování rozšíření se web rozjede a maximálně v debug baru vyhodí nějaké upozornění že není nastaven žádný profil.
  2. Nebo při zaregistrování a nedefinování sekce environment a alespoň jednoho profilu vyhodí vyjímku (současný stav).

V budoucnu se nad tímhle rozšířením bude dát vyblbnout. Nyní není úplně priorita mít nyní podchycené všechny možnosti co na projektech můžou nastat. Bude se to nabalovat postupně.

tg666 commented 7 years ago

Pro možnost disable už byl poslán PR. Osobně bych se přikláněl asi k variantě 1. Zobrazit v Panelu informaci + rozmyslet se, jestli by metoda Environment::getProfile() měla v tomto případě vracet NULL, nebo vyhazovat výjimku.

Dále si myslím, že by na seznamu priorit němělo chybět nějaké rozhraní a základní implementace pro ukládaní aktuální kombinace profilu.

tg666 commented 7 years ago

Btw. Ohledně informace localeDomain pro router

V Nette je zvyklostí registrovat router nějak takhle:

class RouterFactory
{
    public static function createRouter()
    {
        # vrácí Nette\Application\IRouter, resp. RouteList
    }
}

# config
router: App\RouterFactory::createRouter

Jako služba je tedy zaregistrovaný objekt RouteList, avšak teď je otázka, jak tento parametr získat již v metodě ::createRouter()

První možnost je si ho ručně předat například z parametrů (což postrádá smysl, aby byl tento parametr v konfiguraci Environmentu) router: App\RouterFactory::createRouter(%foo%)

Další možnost, co mne napadla je v EnvironmentExtension::afterCompile() přidat pro objekt RouteList extension method, takže si může RouteList vytáhnout parametr přímo ze sama sebe. Toto řešení funguje, avšak extension methods jsou až na výjimky (Forms) od Nette 2.4 deprecated.

Napadá tě nějaké jiné řešení?