RFC – typový autowiring dvou parametrů handleru formuláře
- m.brecher
- Generous Backer | 905
Ahoj,
Parametry do handleru formuláře se předávají typově + pozičně kombinovaným autowiringem, kdy pro jeden parametr nette použije autowiring podle typu, zatímco pro dva parametry použije autowiring podle pozice parametru, kombinovaný s respektováním typu druhého parametru. Složitá logika autowiringu vývojáře zbytečně zatěžuje.
Téma již bylo diskutováno zde: https://forum.nette.org/…ni-parametru
Příklady:
protected function formSucceeded(ArrayHash $values){} // funguje
protected function formSucceeded(ArrayHash $values, Form $form){} // Error
přitom ale:
protected function formSucceeded(Form $form){} // funguje
Popis řešení
Přidat v případě dvou otypovaných parametrů novou logiku plně typového autowiringu, pro běžně používané datové typy $values – ArrayHash, stdClass a array. Typové předání SubmitButton neřešit, protože se málo využívá. Pro použití v průmyslové praxi postačí typový autowiring pro $form a $values současně.
Problematické, neočekáváné chování vykazují tyto kombinace:
protected function formSucceeded(ArrayHash $values, Form $form){} // Error
protected function formSucceeded(array $values, Form $form){} // Error
protected function formSucceeded(stdClass $values, Form $form){} // Error
Takto nastavené typy u parametrů vždy vyhodí Error, bez ohledu na další zpracování v samotném handleru, který se vůbec neinvokuje. Z toho vyplývá, že pokud v přidané paralelní logické větvi (bez ovlivnění existující logiky) zpracujeme tyto tři kombinace typů, bude tato změna 100% BC safe.
Přínos
Navrhovaná úprava snadným a 100% backward-kompatibilním způsobem zajistí moderní a „plně typový“ autowiring formulářů, kde na pořadí parametrů nezáleží.
https://github.com/…rms/pull/345
Díky za případné komentáře.
Editoval m.brecher (22. 7. 23:41)