Speciální třídy pro validace a filtry
- jantichy
- Člen | 24
Ahoj, v Nette mi strašně chybí nějaké třídy pro validace nebo konverze jakýchkoliv obecných hodnot.
Nyní jsou validátory napasované natvrdo jen a pouze ve formulářích respektive ve třídě Nette\Forms\TextBase. Což je škoda, protože se nedají vůbec nebo jen velice obtížně a neelegantně použít i jinde, například v aplikačním modelu.
To samé pak platí i pro konverze, respektive filtry. Ty jsou teď umístěny v Nette\Templates\TemplateFilters, což jednak není moc pěkné pro použití někde jinde v aplikaci, protože to prostě jakoby patří jen do templates. Druhak pak tam jsou účelově dané filtry jen a pouze pro šablony a spousta užitečných filtrů tam vůbec není. Něco málo pak je i ve třídě String apod.
Můj návrh tedy je – všechny validátory a filtry vyčlenit do speciálních obslužných tříd někde na vrchu celého Nette, mimo jakékoliv účelové zanoření v šablonách nebo formulářích, například Nette\Validator a Nette\Filter.
Byly by to de facto vlastně jen schránek na statické metody. Tam by pak byly centralizované všechny filtry a metody, snadno volatelné odkudkoliv. Takže v důsledku by se pak i například uvnitř Nette\Forms\TextBase volaly jen tyto statické metody, místo aby byly implementovány přímo tam.
Je toto směr, kterým by to mohlo jít a kterým by se chtělo jít?
Editoval jantichy (18. 7. 2010 15:17)
- Patrik Votoček
- Člen | 2221
Jak už psal Ola o implementaci jsem se pokusil , pull request jsem poslal. (už to tam visí víc jak měsíc). Ještě se tady včera objevilo jedno vlákno https://forum.nette.org/…atoru-napady na stejné téma.
Btw po tomto tady volám už více jak půl roku (pokud se dobře pamatuji poprvé jsem tento návrh vznesl džínové Poslední Sobotě)
- Honza Kuchař
- Člen | 1662
Ano, určitě ano, ale myslím, že je zbytečné to sem psát, protože nevím, proč by měl být někdo proti. :)
- David Grudl
- Nette Core | 8218
jantichy napsal(a):
Nyní jsou validátory napasované natvrdo jen a pouze ve formulářích respektive ve třídě Nette\Forms\TextBase. Což je škoda, protože se nedají vůbec nebo jen velice obtížně a neelegantně použít i jinde, například v aplikačním modelu.
Viz https://forum.nette.org/…atoru-napady?…
To samé pak platí i pro konverze, respektive filtry. Ty jsou teď umístěny v Nette\Templates\TemplateFilters, což jednak není moc pěkné pro použití někde jinde v aplikaci, protože to prostě jakoby patří jen do templates. Druhak pak tam jsou účelově dané filtry jen a pouze pro šablony a spousta užitečných filtrů tam vůbec není.
Ehm… divoká konstrukce. Jinými slovy, je všechno v pořádku, že?
Můj návrh tedy je – všechny validátory a filtry vyčlenit do speciálních obslužných tříd někde na vrchu celého Nette, mimo jakékoliv účelové zanoření v šablonách nebo formulářích, například Nette\Validator a Nette\Filter.
A co účelové filtry šablon jako Latte nebo účelové validátory jako SubmitButton::validateSubmitted? Rozumím myšlence, ale dle mého neodpovídá zcela realitě.
…Takže v důsledku by se pak i například uvnitř Nette\Forms\TextBase volaly jen tyto statické metody, místo aby byly implementovány přímo tam.
Podívej se na zdrojový kód TextBase – všechny validátory (s výjimkou emailu) jsou vlastně voláním statických metod, které jsou implementovány jinde.
Teoreticky by se mohlo jít ještě dál a místo
return String::length($control->value) >= $length;
použít
return Nette\Validators::isMinLength($control->value, $length)
a
vytvořit příslušnou metodu Validators::isMinLength
, ale nejsem
si jist, jestli je po tom skutečně poptávka.
Je toto směr, kterým by to mohlo jít a kterým by se chtělo jít?
Svým způsobem ano, ale jak píšu v prvním odkazu, tohle téma je trošku komplexnější. Momentálně zcela přepisuju princip JavaScriptové validace formulářů a s tím souvisí i zavedení filtrování do server-side validace.