在 Zend Framework 2 Forms 中跳过验证器
Skip validators in Zend Framework 2 Forms
我正在使用 Zend Framework 2 构建我的项目。在我的一个表单中,我有一个字段,只有在满足给定条件(例如另一个表单字段的值)时才需要使用多个验证器进行验证。
有没有办法完全跳过基于外部条件的字段验证?
您可以使用 InputFilter
class 中的方法 setValidationGroup
来设置应验证哪些输入字段。
例如,您可以扩展 InputFilter
class 并在自定义 setData
方法中使用 setValidationGroup
,并根据特定对象的存在设置组$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);
}
}
扩展 class 只是展示可能性的一种选择。您当然也可以在外部其他地方 setValidationGroup
而无需自定义 InputFilter
class.
$group = array(
// your custom validation group
);
$inputFilter->setValidationGroup($group);
您还可以使用 Zend\Validator\ValidatorInterface
中的 $context
参数来获取其他表单元素的值。您只需要一个自定义验证器并将其设置在表单元素上。
例如:
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()
{}
}
我正在使用 Zend Framework 2 构建我的项目。在我的一个表单中,我有一个字段,只有在满足给定条件(例如另一个表单字段的值)时才需要使用多个验证器进行验证。
有没有办法完全跳过基于外部条件的字段验证?
您可以使用 InputFilter
class 中的方法 setValidationGroup
来设置应验证哪些输入字段。
例如,您可以扩展 InputFilter
class 并在自定义 setData
方法中使用 setValidationGroup
,并根据特定对象的存在设置组$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);
}
}
扩展 class 只是展示可能性的一种选择。您当然也可以在外部其他地方 setValidationGroup
而无需自定义 InputFilter
class.
$group = array(
// your custom validation group
);
$inputFilter->setValidationGroup($group);
您还可以使用 Zend\Validator\ValidatorInterface
中的 $context
参数来获取其他表单元素的值。您只需要一个自定义验证器并将其设置在表单元素上。
例如:
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()
{}
}