在验证类中,我的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
,但我没有找到任何办法。
答案 0 :(得分:2)
IsInRole
使用区分大小写的InclusionIn
。您必须编写自己的in_array
才能获得所需的功能。 Here是类的实现,因此您可以看到可用的选项。
另一种选择是在触发验证器之前格式化输入。例如如果他们输入Validator
或male
,请将其转换为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');
}
}