Zend Input Filter "either or" 场景是不可能的?
Zend Input Filter "either or" scenarios is not possible?
我正在使用 "zendframework/zend-inputfilter" v2.8.1。对我来说非常令人惊讶 - 我无法找到下一个场景的配置或设置选项:
我们有 2 个字段,需要填充一个或另一个。
例如:我们有 2 个字段:“year”和“age”。我想创建一个验证配置,其中需要设置 "year" 或 "age"。
所以我的有效载荷应该是这样的
{
"year": 2000
}
或
{
"age": 18
}
或
{
"year": 2000,
"age": 18
}
这个应该是无效的:
{}
不幸的是,像这样的其他问题 (Conditionally required in Zend Framework's 2 InputFilter) 似乎已经过时或不准确。例如,如果我尝试使字段 "year" 可选,对于 payloads
{
"age": 18
}
和
{}
由于 \Zend\InputFilter\BaseInputFilter::validateInputs
中的这段代码,它被跳过了
// If input is optional (not required), and value is not set, then ignore.
if (! array_key_exists($name, $data)
&& ! $input->isRequired()
) {
continue;
}
如果我要求它,我会在 \Zend\InputFilter\Input::isValid
中达到条件
if (! $hasValue && $required) {
if ($this->errorMessage === null) {
$this->errorMessage = $this->prepareRequiredValidationFailureMessage();
}
return false;
}
我犹豫要不要覆盖 BaseInputFilter 或 Input 类,但从我现在看到的情况来看,这似乎是我唯一的选择。但是也许我错过了一些东西。我将不胜感激任何建议,谢谢!
我相信您需要的是自定义验证器。
你可以做类似的事情。
class AgeYearValidator extends Zend\Validator\AbstractValidator
{
const AGE = 'age';
const YEAR = 'year';
const EMPTY = 'empty';
protected $messageTemplates = array(
self::AGE => "Age is invalid. It must be between 1 to 110.",
self::YEAR => "Year is invalid. It must between 1900 to 2050.",
self::EMPTY => "Age and Year input fields are both empty."
);
public function isValid($value, $context = null)
{
$isValid = true;
$year = null;
$age = null;
if(isset($context['year'])){
$year = (int)$context['year'];
}
if(isset($context['age'])){
$age = (int)$context['age'];
}
if(is_null($year) && is_null($age)) {
$this->error(self::EMPTY);
$isValid = false;
} else {
$isAgeValid = false;
if($age > 0 && $age < 110) {
$isAgeValid = true;
}
$isYearValid = false;
if($year > 1900 && $year < 2050) {
$isYearValid = true;
}
if($isAgeValid || $isYearValid) {
$isValid = true;
} else if (!$isAgeValid) {
$this->error(self::AGE);
$isValid = false;
} else if (!isYearValid) {
$this->error(self::YEAR);
$isValid = false;
}
}
return $isValid;
}
}
我以前用过类似的东西,效果很好。代码本身是 self-explanatory。您可以在 Zend Validators 上找到更多信息。我可以看到他们缺少一些关于 zend doco 的信息,我已将这些信息添加到我的代码中以使其正常工作。
我正在使用 "zendframework/zend-inputfilter" v2.8.1。对我来说非常令人惊讶 - 我无法找到下一个场景的配置或设置选项:
我们有 2 个字段,需要填充一个或另一个。
例如:我们有 2 个字段:“year”和“age”。我想创建一个验证配置,其中需要设置 "year" 或 "age"。
所以我的有效载荷应该是这样的
{
"year": 2000
}
或
{
"age": 18
}
或
{
"year": 2000,
"age": 18
}
这个应该是无效的:
{}
不幸的是,像这样的其他问题 (Conditionally required in Zend Framework's 2 InputFilter) 似乎已经过时或不准确。例如,如果我尝试使字段 "year" 可选,对于 payloads
{
"age": 18
}
和
{}
由于 \Zend\InputFilter\BaseInputFilter::validateInputs
// If input is optional (not required), and value is not set, then ignore.
if (! array_key_exists($name, $data)
&& ! $input->isRequired()
) {
continue;
}
如果我要求它,我会在 \Zend\InputFilter\Input::isValid
if (! $hasValue && $required) {
if ($this->errorMessage === null) {
$this->errorMessage = $this->prepareRequiredValidationFailureMessage();
}
return false;
}
我犹豫要不要覆盖 BaseInputFilter 或 Input 类,但从我现在看到的情况来看,这似乎是我唯一的选择。但是也许我错过了一些东西。我将不胜感激任何建议,谢谢!
我相信您需要的是自定义验证器。
你可以做类似的事情。
class AgeYearValidator extends Zend\Validator\AbstractValidator
{
const AGE = 'age';
const YEAR = 'year';
const EMPTY = 'empty';
protected $messageTemplates = array(
self::AGE => "Age is invalid. It must be between 1 to 110.",
self::YEAR => "Year is invalid. It must between 1900 to 2050.",
self::EMPTY => "Age and Year input fields are both empty."
);
public function isValid($value, $context = null)
{
$isValid = true;
$year = null;
$age = null;
if(isset($context['year'])){
$year = (int)$context['year'];
}
if(isset($context['age'])){
$age = (int)$context['age'];
}
if(is_null($year) && is_null($age)) {
$this->error(self::EMPTY);
$isValid = false;
} else {
$isAgeValid = false;
if($age > 0 && $age < 110) {
$isAgeValid = true;
}
$isYearValid = false;
if($year > 1900 && $year < 2050) {
$isYearValid = true;
}
if($isAgeValid || $isYearValid) {
$isValid = true;
} else if (!$isAgeValid) {
$this->error(self::AGE);
$isValid = false;
} else if (!isYearValid) {
$this->error(self::YEAR);
$isValid = false;
}
}
return $isValid;
}
}
我以前用过类似的东西,效果很好。代码本身是 self-explanatory。您可以在 Zend Validators 上找到更多信息。我可以看到他们缺少一些关于 zend doco 的信息,我已将这些信息添加到我的代码中以使其正常工作。