问题
I wonder how Zend_Form validates inputs, I mean how does it know which input fields to validate. I looked to php globals($_POST, $_GET) and I didn't see anything set as an identifier(for example ) in order to know how validate. Can anyone suggest me any guide for this stuff?
回答1:
Well, the best option to find out is to look at the code of Zend_Form:
/**
 * Validate the form
 *
 * @param  array $data
 * @return boolean
 */
public function isValid($data)
{
    if (!is_array($data)) {
        require_once 'Zend/Form/Exception.php';
        throw new Zend_Form_Exception(__METHOD__ . ' expects an array');
    }
    $translator = $this->getTranslator();
    $valid      = true;
    $eBelongTo  = null;
    if ($this->isArray()) {
        $eBelongTo = $this->getElementsBelongTo();
        $data = $this->_dissolveArrayValue($data, $eBelongTo);
    }
    $context = $data;
    foreach ($this->getElements() as $key => $element) {
        if (null !== $translator && $this->hasTranslator()
                && !$element->hasTranslator()) {
            $element->setTranslator($translator);
        }
        $check = $data;
        if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
            $check = $this->_dissolveArrayValue($data, $belongsTo);
        }
        if (!isset($check[$key])) {
            $valid = $element->isValid(null, $context) && $valid;
        } else {
            $valid = $element->isValid($check[$key], $context) && $valid;
            $data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
        }
    }
    foreach ($this->getSubForms() as $key => $form) {
        if (null !== $translator && !$form->hasTranslator()) {
            $form->setTranslator($translator);
        }
        if (isset($data[$key]) && !$form->isArray()) {
            $valid = $form->isValid($data[$key]) && $valid;
        } else {
            $valid = $form->isValid($data) && $valid;
        }
    }
    $this->_errorsExist = !$valid;
    // If manually flagged as an error, return invalid status
    if ($this->_errorsForced) {
        return false;
    }
    return $valid;
}
which means in a nutshell, Zend_Form will iterate over all the configured elements in the form and compare them against the values in the array you passed to it. If there is a match, it will validate that individual value against the configured validators.
回答2:
So, you create form in action and then check is there post|get data. You can check is_valid form right here. You need pass $_POST or $_GET data to isValid() function. Example:
if ($request->isPost() && $form->isValid($request->getPost())) {
isValid() is function Zend_Form class. Form runs all validations for each element (just if you dont set to stop in first validation fail) and then for subforms too.
回答3:
Look at Zend_Form quickstart, it's a very bright example on how to start dealing with forms in Zend.
Validating a text input looks like this:
$username = new Zend_Form_Element_Text('username');
// Passing a Zend_Validate_* object:
$username->addValidator(new Zend_Validate_Alnum());
// Passing a validator name:
$username->addValidator('alnum');
    回答4:
Or you can use:
    $username_stringlength_validate = new Zend_Validate_StringLength(6, 20); 
    $username = new Zend_Form_Element_Text('username');
    $username->setLabel('Username: ')
             ->addFilters(array('StringTrim', 'HtmlEntities'))
             ->setAttrib('minlength', '6')
             ->setAttrib('class', 'required')
             ->removeDecorator('label')
             ->removeDecorator('HtmlTag')
             ->removeDecorator('DtDdWrapper')
             ->setDecorators(array(array('ViewHelper'), array('Errors')))
             ->addValidator($username_stringlength_validate);
    来源:https://stackoverflow.com/questions/5457027/zend-form-validation