RFC – typový autowiring dvou parametrů handleru formuláře

m.brecher
Generous Backer | 905
+
0
-

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)