Подтвердите тот же пароль с помощью Zend_Filter_Input

#validation #zend-framework #password-confirmation

#проверка #zend-framework #подтверждение пароля

Вопрос:

ZF 1.11.3 здесь.

 $validators = array(
    'pass1' => array('presence' => 'required'),
    'pass2' => array(array('Identical', true, 'token' => 'pass1'))
),

$input = new Zend_Filter_Input(array(), $validators, $this->_request->getParams());

if (!$input->isValid()) {
    var_dump($input->getMessages());
}
  

Используя приведенный выше код, я получаю (на самом деле, в формате firephp):

 ['pass2'] =>
array(
  ['notSame'] => 'The two given tokens do not match'
)
  

Как вы могли предположить, эта ошибка отображается, даже если «pass1» и «pass2» содержат одну и ту же строку (по сути, это форма подтверждения пароля).

Я не могу использовать Zend_Form или addValidator () (не спрашивайте), поэтому я должен поработать с этим синтаксисом, вот почему я думаю, что это не работает. Я имею в виду array(array('Identical', true, 'token' => 'pass1')) . Я даже пробовал array(array('Identical', true, array('token' => 'pass1'))) , получая ту же ошибку. Кажется, я не понимаю, где должны быть установлены эти массивы.

Предложения, исправления или «halp!».

Ответ №1:

Если вы не можете использовать, Zend_Valiate_* вы не можете использовать, Zend_Filter_Input потому что Zend_Filter_Input будут пытаться создать экземпляры валидаторов, указанных в массиве.

Кроме того, я думаю, что ваш синтаксис неправильный. Посмотрите на этот пример из руководства:

 $validators = array(
    'password' => array(
        'Identical',
        'fields' => array('password1', 'password2')
    )
);
  

Комментарии:

1. Я не знаю, откуда вы взяли этот пример, но я смотрю на руководство прямо сейчас, и его там нет . Я могу использовать Zend_Validate_ *; Я не говорил, что не могу. Я просто не могу использовать (более простой) синтаксис addValidator() . Я использовал Zend_Filter_Input раньше, но не «идентичный».

2. Хорошо, я немного поиграл в исходном коде ZF, и кажется, что он проверяет мое входное значение «pass2» (скажем, «xxx») на «pass1» , а не на значение «pass1». Если я введу «pass1» в текстовый ввод «pass2», это сработает. Как именно ZF узнает, что значение токена является именем ввода, а не фактическим значением? Код находится в Zend_Validate_Identical::isValid().

Ответ №2:

Если бы Zend_Filter_Input использовал контекст, он бы проверял сравнение со значением some_input_name , а не со строкой типа some_input_name . И поскольку я не использую Zend_Form, он не может использовать контекст.

Zend_Filter_Input не работает с контекстом, но с помощью Zend_Form_Element вы можете использовать context.

http://framework.zend.com/issues/browse/ZF-10673