Speciální třídy pro validace a filtry

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jantichy
Člen | 24
+
+1
-

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)

Ola
Člen | 385
+
0
-

Nějaký pokus tu byl, ale nevím, v jakém je to stavu.

Jinak +1 :)

Editoval Ola (18. 7. 2010 16:04)

Petr Stribny
Člen | 16
+
0
-

+1

Honza Marek
Člen | 1664
+
0
-

+1

Patrik Votoček
Člen | 2221
+
0
-

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ě)

Majkl578
Moderator | 1364
+
0
-

Řešilo se to tu už včera. (Nesloučíme tyhle dvě vlákna? (Jde to vůbec?) Navrhuji přesunout tohle do toho Blizzyho)

Vyki
Člen | 388
+
0
-

Minulý rok v červnu o tom David mluvil už na školení jako o věci, která Nette chybí, ale bohužel rok se s rokem sešel a nic se v tomto ohledu nepohnulo.

Honza Kuchař
Člen | 1662
+
0
-

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 | 8147
+
0
-

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.