gpt4 book ai didi

zend-framework - 如何过滤/验证 bool 值?

转载 作者:行者123 更新时间:2023-12-04 05:42:18 25 4
gpt4 key购买 nike

我正在阅读关于 Quality Assurance for PHP Projects 的精彩介绍作者:Michelangelo van Dam,又名 DragonBe。在他的演示中,他使用 Zend-Framework 作为示例,我在基本级别上熟悉它。

由于我想提高自己,所以我从单元测试开始,尽管我觉得问题出在 ZF 方面。

问题:

每当我分配 bool 值 false 时,都会使用给定的代码工件Zend_Filter 或 Zend_Validator 将其更改为 null .我不明白为什么会这样。

请参阅底部更新以获取更新的代码和测试

首先是测试

public function goodData() {
return array(
array('DU-IT', 'Sample Description', true, false),
array('Mercüß', 'bla"ß"trager', false, true),
array('Mia123', '728 Tage im Jahr', false, false)
);
}

/**
* @dataProvider goodData()
*/
public function testModelAcceptsValidData($name, $description, $flag_active, $flag_deleted)
{
$data = array(
'id' => 0,
'name' => $name,
'description' => $description,
'flag_active' => $flag_active,
'flag_deleted' => $flag_deleted
);

try {
$this->_model->populate($data);
} catch (Zend_Exception $e) {
$this->fail('Unexpected Exception: '.$e->getMessage());
}

$this->assertSame($data, $this->_model->toArray());
}

型号
public function __construct($props = null)
{
// Set Filters
$this->_filters = array(
'id' => array('Int'),
'name' => array('StringTrim', 'StripTags'),
'description' => array('StringTrim', 'StripTags'),
'flag_active' => array(new Zend_Filter_Boolean()),
'flag_deleted' => array(new Zend_Filter_Boolean())
);

// Set Validators
$this->_validators = array(
'id' => array('Int'),
'name' => array(new Zend_Validate_StringLength(array('min'=>4, 'max'=>50))),
'description' => array(new Zend_Validate_StringLength(array('max'=>5000))),
'flag_active' => array(new Zend_Validate_InArray(array(true, false))),
'flag_deleted' => array(new Zend_Validate_InArray(array(true, false)))
);

// Set Properties
if (!is_null($props)) {
$this->populate($props);
}
}

public function setFlagActive($arg)
{
$input = new Zend_Filter_Input($this->_filters, $this->_validators);
$input->setData(array('flag_active'=>$arg));
if (!$input->isValid('flag_active')) {
throw new Zend_Exception('Invalid FLAG_ACTIVE provided'. gettype($input->flag_active));
}
$this->_flag_active = (bool) $input->flag_active;
return $this;
}

就模型而言,我尝试将验证器留给 flag_activeflag_deleted空,但这并没有改变我的结果。 phpunit的错误信息还是一样:
Unexpected Exception: Invalid FLAG_ACTIVE providedNULL

而 NULL 是变量的类型,当我通过时 false通过数据提供者 goodData() 作为标志的参数(badData 也是如此)。

我的猜测是这与 Zend_Filter 有关系,但我就是想不通。非常感谢提示!

更新
由于德鲁给出了一点提示,我已经进一步测试了,但问题仍然存在。我已将更新的类和单元测试粘贴到 pastebin 上以提高可读性。
  • PasteBin of the Model Class
  • PasteBin of the TestClass

  • PHPUnit 给出以下错误: You must give a non-empty value for field 'flag_active' flag_deleted 也一样。一半测试的第二个错误是 <null> does not match expected type "boolean" .我被困住了。无论我使用过滤器还是 inArrayValidator(array(0=>true,1=>false)) 它都不会改变任何事情:\

    最佳答案

    如果您检查 $input->getMessages() 的内容,它应该提供一些关于为什么该特定值无效的解释。

    当您使用 Zend_Filter_Input ,任何未通过验证的值都无法通过其名称神奇地访问(例如 $input->flag_active )。该值将始终为 NULL如果它没有通过验证步骤。

    某些过滤器在某些情况下几乎可以保证验证(即带有 Int 验证器的 Int 过滤器),因为过滤器将过滤数据并返回验证器的有效值。路过hello通过 Int过滤器返回 0这可以通过一个简单的 Int 进行验证即使原始输入数据无效,验证器也是如此。

    您最有可能在异常中获得空值的原因是该值不可用,因为它没有经过验证;因此,请检查输入消息以获取有关原因的任何提示。

    编辑:

    我认为您遇到的问题是 Zend_Filter_Input默认情况下不允许空值。因此,如果进入过滤器的值为 falseNULL ,它会导致过滤器出错。

    看看这个代码:

        <?php

    // set up a boolean validator and inarray validator like you have
    $filters = array('test' => array(new Zend_Filter_Boolean()));
    $validators = array('test' => array(new Zend_Validate_InArray(array(true, false))));

    // set up the input filter with default options
    $input = new Zend_Filter_Input($filters, $validators);

    // our "input" value which is (bool)false
    $test = false;

    $input->setData(array('test' => $test));

    // run through input filter using default values
    // should throw error about a non-empty value
    if (!$input->isValid('test')) {
    echo "Test is not valid. <br />Original Value: ";
    var_dump($test);
    echo "<br />";
    print_r($input->getMessages());
    } else {
    echo "Test is valid.<br />Original Value: ";
    var_dump($test);
    echo "<br />Value now: ";
    var_dump($input->test);
    }

    // now allowing empty values...
    echo "<hr />\n";

    // tell Zend_Filter_Input to allow empty values on input
    $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);

    // set up new input filter with option
    $input = new Zend_Filter_Input($filters, $validators, null, $options);

    $input->setData(array('test' => $test));

    // run through input filter allowing empty values
    // this should NOT throw an error
    if (!$input->isValid('test')) {
    echo "Test is not valid. <br />Original Value: ";
    var_dump($test);
    echo "<br />";
    print_r($input->getMessages());
    } else {
    echo "Test is valid.<br />Original Value: ";
    var_dump($test);
    echo "<br />Value now: ";
    var_dump($input->test);
    }

    所以问题似乎是 Zend_Filter_Input 不喜欢空值,除非你指定一个选项。因此,除非您设置 false,否则将有效( Zend_Filter_Input::ALLOW_EMPTY )值发送到过滤器会导致错误至 true .

    关于zend-framework - 如何过滤/验证 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11136008/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com