我正在使用Zend Framework 2来构建我的项目。在我的一个表单中,我有一个字段,只有在满足给定条件时才需要使用多个验证器进行验证(例如,另一个表单字段的值)。
有没有办法完全跳过基于外部条件的字段验证?
答案 0 :(得分:1)
您可以使用setValidationGroup
类中的方法InputFilter
来设置应验证哪些输入字段。
例如,您可以扩展InputFilter
类并在自定义setValidationGroup
方法中使用setData
,并根据{{1}中某个字段的存在来设置该组}。
例如:
$data
扩展课程只是展示可能性的一个选项。当然,您也可以在其他地方外部<?php
namespace Application\InputFilter;
use Zend\InputFilter\InputFilter;
class CustomInputFilter extends InputFilter
{
/**
* Set data to use when validating and filtering
*
* @param array|Traversable $data
* @return InputFilterInterface
*/
public function setData($data)
{
$group = array(
// your custom validation group
);
if(isset($data['fieldName'])){
$this->setValidationGroup($group);
}
// Forward to default setData method
return parent::setData($data);
}
}
而无需自定义setValidationGroup
类。
InputFilter
答案 1 :(得分:0)
您还可以使用$context
中的Zend\Validator\ValidatorInterface
参数来获取其他表单元素的值。您只需要一个自定义验证器并将其设置在表单元素上。
例如:
use Zend\Validator;
use Zend\Validator\Exception;
class MyCustomValidator implements Validator\ValidatorInterface
{
public function isValid($value, array $context = [])
{
if (! isset($context['name_of_other_field'])) {
throw new Exception\RuntimeException('name_of_other_field missing.');
}
if (1234 === $context['name_of_other_field']) {
$validator = new Validator\ValidatorChain();
$validator->attach(new Validator\StringLength(['min' => 8, 'max' => 12]));
$validator->attach(new Validator\EmailAddress());
return $validator->isValid($value);
}
return true;
}
public function getMessages()
{}
}