Malo flexibilna trieda Rules, navrh k uprave
- westrem
- Člen | 398
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
- brat iba jeden argument
- 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
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.