gpt4 book ai didi

php - 如何让这个 Filter 在这个 Validator 之后运行

转载 作者:可可西里 更新时间:2023-11-01 13:11:38 24 4
gpt4 key购买 nike

我有一个元素。我想向其添加自定义验证器和自定义过滤器。验证器确保输入是几个允许值之一,然后过滤器将一些自定义值添加到输入。这意味着我必须在运行过滤器之前先验证原始输入。我按照这个顺序做

$element = new Zend_Form_Element_Text('element');
$element->addValidator('PermittedValue', false);
$element->addFilter('TotalHyphen', false);
$this->addElement($element);

但是这个命令没有得到遵守。过滤器首先运行并更改数据,然后验证器在过滤后的数据上运行,这意味着即使输入有效,它也总是失败。好像来自documentation这是故意的

Note: Validation Operates On Filtered Values Zend_Form_Element::isValid() filters values through the provided filter chain prior to validation. See the Filters section for more information.

如何指定验证器和过滤器的运行顺序?

最佳答案

当然,创建一个支持验证后过滤的自定义元素似乎是可行的方法。这个怎么样:

/**
* An element that supports post-validation filtering
*/
class My_Form_Element_PostValidateFilterable extends Zend_Form_Element_Text
{
protected $_postValidateFilters = array();

public function setPostValidateFilters(array $filters)
{
$this->_postValidateFilters = $filters;
return $this;
}

public function getPostValidateFilters()
{
return $this->_postValidateFilters;
}

public function isValid($value, $context = null)
{
$isValid = parent::isValid($value, $context);
if ($isValid){
foreach ($this->getPostValidateFilters() as $filter){
$value = $filter->filter($value);
}
$this->setValue($value);
}
return $isValid;
}
}

用法是这样的:

$elt = $form->addElement('PostValidateFilterable', 'myElement', array(
'label' => 'MyLabel',
'filters' => array(
'StringTrim',
// etc
),
'validators' => array(
'NotEmpty',
// etc
),
// here comes the good stuff
'postValidateFilters' => array(
new My_Filter_RunAfterValidateOne(),
new My_Filter_RunAfterValidateTwo(),
),
));

这使验证和过滤保持在表单中 - 使 Controller 保持精简。

未经测试,只是在黑暗中刺伤。当然,您可以增加/修改 API 以通过按键等方式添加/删除过滤器。

你觉得呢?

关于php - 如何让这个 Filter 在这个 Validator 之后运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823514/

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