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