簡體   English   中英

Zend輸入過濾器“要么”要么不可能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM