使用phalcon验证类进行不区分大小写的验证

时间:2015-09-29 07:01:02

标签: php validation phalcon

在验证类中,我的intiialize函数就像这样

public function initialize()
{
    $this->add('gender',new InclusionIn(array(
           'message' => 'Please enter a valid Gender',
           'domain' => array('Male','Female'),
           'case_insensitive' => false
    )));
}

问题是,InclusionIn进行区分大小写的验证,因此如果用户输入“男性”应用程序会引发错误请输入有效的性别。我希望这个验证应该是case-insensitive,但我没有找到任何办法。

4 个答案:

答案 0 :(得分:2)

IsInRole使用区分大小写的InclusionIn。您必须编写自己的in_array才能获得所需的功能。 Here是类的实现,因此您可以看到可用的选项。

另一种选择是在触发验证器之前格式化输入。例如如果他们输入Validatormale,请将其转换为MALE,以便验证通过。

答案 1 :(得分:2)

As @ M2sh& @honerlawd指导,最后我写了一个新的验证器,以便在这里分享代码

<?php

namespace library\app\validators;

use Phalcon\Validation;
use Phalcon\Validation\Validator;
use Phalcon\Validation\Exception;
use Phalcon\Validation\Message;

class InclusionIn extends Validator
{

    /**
     * Executes the validation
     */
    public function validate(Validation $validation, $attribute)
    {

        $value = $validation->getValue($attribute);

        if ($this->isSetOption("allowEmpty") && empty($value)) {
            return true;
        }

        /**
         * A domain is an array with a list of valid values
         */
        $domain = $this->getOption("domain");
        if (!is_array($domain)) {
            throw new Exception("Option 'domain' must be an array");
        }
        $refinedDomain = array_map('strtolower', $domain);

        $strict = false;
        if ($this->isSetOption("strict")) {
            if (!is_bool($strict)) {
                throw new Exception("Option 'strict' must be a boolean");
            }

            $strict = $this->getOption("strict");
        }

        /**
         * Check if the value is contained by the array
         */
        if (!in_array(strtolower($value), $refinedDomain, $strict)) {

            $label = $this->getOption("label");
            if (empty($label)) {
                $label = $validation->getLabel($attribute);
            }

            $message = $this->getOption("message");
            $replacePairs = ['field' => $label, 'domain' => join(", ", $domain)];
            if (empty($message)) {
                $message = $validation->getDefaultMessage("InclusionIn");
            }

            $validation->appendMessage(new Message(strtr($message, $replacePairs), $attribute, "InclusionIn"));
            return false;
        }

        return true;
    }

}

答案 2 :(得分:1)

如果验证模型,您可以使用beforeValidation()beforeValidationOnCreate()beforeValidationOnUpdate()小写/大写值:

function beforeValidation() {
    $this->gender = ucfirst($this->gender);
}

如果通过Forms进行验证,您可以应用addFilter(lower)并验证小写例如。

答案 3 :(得分:1)

您现在可以使用过滤器查看phalcon过滤和消毒https://docs.phalconphp.com/en/latest/reference/filter.html

在这样的控制器中:需要将注释过滤器添加到服务初始化

$gender = $this->filter->sanitize($gender, "lower");

OR

在customValidation类中:

class MyValidation extends Validation 
{
    public function initialize()
    {
       $this->add('gender',new InclusionIn(array(
         'message' => 'Please enter a valid Gender',
         'domain' => array('male','female'),
       )));

       $this->setFilters('gender', 'lower');
    }
}