Malo flexibilna trieda Rules, navrh k uprave

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

Ahoj,
k tomuto prispevku som sa dlho odhodlaval a jeho obsah presiel mnohymi myslienkovymi pochodmi co vlastne napisat. Po dokladnej studii kodu od Nette\Forms som ale vlasne sklbil vsetky moje otazky (a z nich vznikajuce problemy) do jednej:

Preco je v Nette trieda Rules napisana tak malo flexibilne a nekompaktne? Tym nemyslim zlu funkcnost, to vobec nie! ale to, ze v podstate neimplementuje ziadne rozhranie a dedi priamo od object-u a pride mi napisana ad-hoc priamo na potreby formularovych prvkov v Nette s minimalnym vyhladom, pre pouzitie v pripade vlastnych implementacii.

Tak to by bolo obecne, konkretne mi vsak vadi, resp. ma zarazaju dve veci, a to ze sa apriori predpoklada, ze validation callback bude

  1. brat iba jeden argument
  2. prijimat IFormControl objekt

To b) som po siahodlhych uvahach ale ozelel, aj ked v podstate priamo v Nette co som pozeral, je len jediny validator, ktory nepracuje s getValue() ale s niecim inym a to je validator k submit buttonu. Toto ma teda nuti, ze akykolvek moj custom validator musi nutne brat ako vstup IFormControl. Preco ale? Co ak ten validator pouzivam obecne na validovanie hodnot, tzn. v podstate by som mu uz rad predaval priamo value, a nie cely control. Kebyze je na tie validatory alebo k tej triede Rules (ano miesam dve veci dokopy) aspon nejaky interface a tym by to bolo predpisane, tak okej, beriem ako vnutorny poziadavok pre konzistenciu Nette, ale nic take nie je. Tento fakt, ako som uz spomenul, ma vsak az tak netrapi, chapem, ze David asi chcel umoznit rozmanitejsiu validaciu a tak pusta do validatorov cely Control, nie iba value.

Preco vsak preboha (velky WTF faktor) sa apriori predpoklada, ze custom validator bude brat iba 1 argument? To ako ideme obmedzovat vsetky validatory, ktore by eventuelne chceli viac argumentov na asociativne pole? Preco preboha? Uplne trivialny priklad je, ked mam napisany vlastny custom validator na range, pseudokod:

function range($value, $min, $max, $rangeType);

Tento fakt ma dost zaraza, pretoze nevidim dovod preco nepodporovat nieco take ako ziskanie vsetkych parametrov predanych metodam addRule, addCondition, addConditionOn a to ukladat do premennej $arg(s).

Dokonca aj implementacia na formatMessage apriori berie v uvahu existenciu single parametra a vobec sa netrapi s tym, ze by ich mohlo byt viac.

Co si o tom myslite vy? Priklonili by ste sa k moznosti implementacie viacerych argumentov, alebo je to len moj vykrik do tmy?

Patrik Votoček
Člen | 2221
+
0
-

K počtu parametrů ti nic moc neřeknu. Ale u onoho IFormControl a $control->getValue() je toto řešení nutné hlavně kvůli $contro->addConditionOn() kde ve chvíli kdy definuješ pravidlo ještě nemusí hodnota existovat. Narazil jsem na to když jsem se snažil předelat Rules univerzálně tak abych je mohl používat i v modelu.