#php #validation
#php #проверка
Вопрос:
Я создал валидатор, который принимает объекты правил для определения правил проверки.
$rules['name1'] = [new NotEmpty(), new MaxChars(20), new Alpha(true)];
$rules['name2'] = [new MaxChars(20), new Alpha(true)];
Что мой валидатор делает с этими объектами правил, так это то, что всякий раз, когда он пытается проверить входные данные, он будет перебирать каждый объект правила и вызывать check()
метод, чтобы узнать, является ли он допустимым или нет. А затем возвращает true или false со списком ошибок.
$validator = new Validator();
$validator->setRule('name1', $rules['name1']); //void
$validator->setRule('name2', $rules['name2']); //void
$validator->validate('name1', 'John Doe'); //true
$validator->validate('name2', ''); //should return true, but returns false
Что было бы хорошим способом указать, что ввод может быть необязательным?
У меня есть класс правил NotEmpty
, но если я просто исключу его из своего объявления правил, мой валидатор все равно будет выполнять цикл и проверять каждый объявленный объект правила. В то время как это должно игнорировать правила и просто return true
. И это был бы идеальный сценарий.
Я думал о том, чтобы тесно связать NotEmpty
класс с моим Validator
классом, например, проверить, присутствует ли он в массиве правил или нет (что означает обязательный или необязательный). Но я бы предпочел, чтобы мои классы были разделены, и я не знаю, возможно ли это так.
Если у кого-нибудь есть хорошее предложение, я могу выполнить дальнейшую реализацию самостоятельно.
Комментарии:
1. Не могли бы вы поделиться своей реализацией
Validator
class?2. Я бы использовал github.com/vlucas/valitron как вдохновение
Ответ №1:
Я бы добавил $required
параметр к setRule()
методу:
$validator->setRule('name1', $rules['name1'], $required = TRUE);
Это связано с тем, что это дополнительное ограничение повлияло бы на все правила, что означает, что в противном случае любому из правил понадобился бы этот параметр.
При наличии параметра setRule
ваш код валидатора может выглядеть следующим образом:
(Псевдокод, надеюсь, это понятно):
if(!value_present($value)) {
if(!$rule->required) {
// no validation needed
return true;
} else {
throw Exception('...');
}
}
// Check constraints now. Constraint's code does not need to know
// about the $required anymore
foreach($rule->constraints as $c) {
$c->apply($value);
}
Комментарии:
1. Разве это не означало бы, что мне тогда пришлось бы просто избавиться от моего
NotEmpty
класса правил? Потому что таким образом функциональность фактически будет находиться внутри самогоValidator
класса.2. Я привел пример. Это рассеивает ваши опасения?
Ответ №2:
Вероятно, это кажется простым, но:
новые максимальные символы (20, необязательно = true)
Или начните с «необязательного» класса и установите флаг. Проверьте этот флаг в других ваших классах.