Реализация дополнительных входных данных в моем валидаторе

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

Или начните с «необязательного» класса и установите флаг. Проверьте этот флаг в других ваших классах.