[英]Zend Input Filter “either or” scenarios is not possible?
我正在使用“ zendframework / zend-inputfilter” v2.8.1。 對我來說非常令人驚訝-我無法找到下一種情況的配置或設置選項:
我們有2個字段,需要填充一個或另一個。
例如:我們有2個字段:“ year ”和“ age ”。 我想創建一個需要配置“年”或“年齡”的驗證配置。
所以我的有效載荷應該看起來像這樣
{
"year": 2000
}
要么
{
"age": 18
}
要么
{
"year": 2000,
"age": 18
}
這應該是無效的:
{}
不幸的是,似乎其他這樣的問題( 在Zend Framework的2 InputFilter中有條件地要求 )已經過時或不准確。 例如,如果我嘗試將字段“ year”設置為可選(對於有效載荷)
{
"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;
}
}
我以前使用過類似的東西,並且效果很好。 代碼本身是不言自明的。 您可以在Zend Validators上找到更多信息。 我可以看到他們在zend doco上缺少一些信息,我在代碼中添加了這些信息以使其正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.