Voi incepe de azi inainte sa transform blogul meu in ceva mai geeky. Si voi incerca in fiecare zi sau la un interval mai regulat sa postez ceva ce am invatat recent. Bun, sa trecem la subiect.
Ieri intr-o aplicatie am avut urmatorul scenariu: a trebuit sa fac o regula de validare custom si sa fac un camp required, doar cand un alt camp este true. Pentru asta, am facut urmatoarea regula:
\Validator::extend('activ', function ($attribute, $value, $parameters, $validator) { $attr = str_replace(['period', 'value'], 'active', $attribute); $data = Arr::get($validator->getData(), $attr); if (!$data) return true; return is_string($value) ? strlen($value) > 0 : (int)$value > 0; });
Tin sa mai precizez ca eu am vrut sa validez un array, deci mai multe randuri. Am facut urmatoarele reguli de validare:
return [ 'notifications.*.type' => 'distinct|in:push,email', 'notifications.*.active' => 'required', 'notifications.*.period' => 'activ|in:days,hours', 'notifications.*.value' => 'activ|integer', ];
Deci simplu, fiecare rand din notifications trebuie sa aiba period si value doar atunci cand active este true.
Problema care am intampinat-o eu este urmatoarea: atunci cand value era null, pur si simplu aplicatia nu intra in regula mea de validare. M-am chinuit ceva timp, dar apoi m-am gandit sa merg la documentatie (de ce nu am facut asta din prima nu stiu). Acolo am gasit asa:
For a rule to run even when an attribute is empty, the rule must imply that the attribute is required. To create such an „implicit” extension, use the
Validator::extendImplicit()
method:
Deci, m-am chinuit minute bune degeaba cand tot ce trebuia sa fac este sa apelez functia statica extendImplicit in loc de cea simpla extend.
Ce avem de invatat de aici?
Pentru ca o regula custom in Laravel sa fie evaluata chiar daca valoarea este null sau empty, trebuie sa extindem validatorul cu functia extendImplicit. Este atat de simplu.
Vezi ce alte lucruri am mai invatat in alte zile urmarind postari similare: toate postarile „azi am invatat”.
Lasă un răspuns