Jak načítat parametry z metody

H0w4rd
Člen | 94
+
0
-

V neonu mám tohle:

translation:
    locales:
        whitelist: %languages%
        default: %defaultLanguage%
        fallback: [%defaultLanguage%]

Potřeboval bych to načítat z LanguageRepository.

Něco takového by mělo fungovat:

translation:
    locales:
        whitelist: @App\Package\Language\LanguageRepository::fetchItemsAsArray()
        default: @App\Package\Language\LanguageRepository::getDefaultLanguage()

Ale hází mi to chybu:

Nette\DI\InvalidConfigurationException
The item ‚translation › locales › whitelist‘ expects to be array, object Nette\DI\Definitions\Statement given.

Nevíte, jak na to?

Marek Bartoš
Nette Blogger | 1127
+
0
-

Fungovat to opravdu může, ale extension kterou používáš explicitně vyžaduje, aby whitelist byl pole.
Pokud s whitelistem extension nepotřebuje pracovat a jen ho předává do služby, tak by šel Statement povolit úpravou kódu té extension.

m.brecher
Generous Backer | 698
+
0
-

@MarekBartoš

také jsem se divil, proč @ App\Package\Language\LanguageRepository::fetchItemsAsArray() která vrací array v konfiguraci extension jakoby místo array vrací Nette\DI\Definitions\Statement.

Otestoval jsem, že pokud v definici rozšíření nekontrolujeme typ konfiguračního parametru, tak Nette\DI\Definitions\Statement se posléze automaticky přetvoří na array. Domýšlím si, že v okamžiku kdy se extension konfiguruje ještě příslušná služba vytvořena není, proto se konfigurační parametr doplní později.

Což je chování, které je matoucí, pokud není řádně vysvětleno. V dokumentaci jsem zkoušel něco na téma konfigurace extension pomocí Nette\DI\Definitions\Statement najít:

https://doc.nette.org/…onfiguration#…
https://doc.nette.org/…n/extensions#…

Našel jsem jen jednoduché ukázky kódů konfigurace extension, ale chybí tam příklad s Nette\DI\Definitions\Statement + nějaké srozumitelné vysvětlení. Časem, jakmile tomu budu více rozumět, bych to do dokumentace doplnil.

Editoval m.brecher (27. 4. 2023 1:56)

Marek Bartoš
Nette Blogger | 1127
+
0
-

Statement představuje expression v konfiguraci. Může jít o objekt, volání metody, … cokoli, co není scalar|null|array. Statement se transformuje na php kód až při kompilaci kontaineru a teprve zkompilovaný kód toho volání vrací array. Takže array bude dostupný až po tom, co kód extension proběhne, zatímco extension vyžaduje array už na svém vstupu.

Extensions vskutku zdokumentované jsou jen základně. Jen to co v nich lze dělat a jakým způsobem nejspíš vydá na několik kapitol… ostatně se o tom můžeš přesvědčit v některých šílenostech co už jsem napsal

Editoval Marek Bartoš (27. 4. 2023 1:55)

m.brecher
Generous Backer | 698
+
0
-

@MarekBartoš

Extensions vskutku zdokumentované jsou jen základně.

Časem, až budu mít chvilku tak zkusím téma prostudovat a s Tvojí odbornou pomocí dokumentaci doplnit. Nemusí tam být všechny složitosti, ale nějaké základní důležité informace které tam chybí bych doplnil.

H0w4rd
Člen | 94
+
0
-

Diky za reakce. Asi jsem mel vcera vecer vypnutou pulku mozku, nedoslo mi, ze je blbost tahat jazyky z databaze, kdyz mam preklady porad ulozene v neon souborech :)

Mozna prave proto je vyzadovano, aby whitelist byl primo pole.

Ale i tak me zarazilo, ze to nejde a soustredil jsem se na to, jak to vyresit a ne na to, jestli to ma smysl.