【问题标题】:Phalcon validate field if exist post data如果存在发布数据,Phalcon 验证字段
【发布时间】:2023-03-04 12:11:02
【问题描述】:

我注意到无论帖子中是否存在该字段,phalcon 验证模型都会进行验证。

public function validation()
{
    $this->validate(new Uniqueness(
        array(
            "field"   => "email",
            "message" => "The email is already registered"
        )
    ));
    $this->validate(new Email(
        array(
            "field"   => "companyEmail",
            "message" => "Email format error"
        )
    ));
    return $this->validationHasFailed() != true;
}

在这种情况下,即使用户保存的是其他数据而不是电子邮件,电子邮件字段仍在验证中。如何使其仅在字段存在时才有效? (对于某些领域,它真的不需要每次都验证)

可能是这样的

if( *syntax* ){
    $this->validate(new Email(
        array(
            "field"   => "companyEmail",
            "message" => "Email format error"
        )
    ));
}

【问题讨论】:

    标签: validation phalcon


    【解决方案1】:

    使用表单类(Phalcon\Forms\Form 的子类),在 beforeValidate 函数中添加代码以检查变量是否存在,并且仅在设置了变量时添加验证器。

    function beforeValidation($data, $entity) 
    {
      ...
      $elements = $this->getElements();
    
      if (isset($data['fieldname'])) {
         $elements['fieldname']->addValidator(new Email(
            array(
                "field"   => "companyEmail",
                "message" => "Email format error"
            )
        ))
         ...
      }
    }
    

    【讨论】:

      【解决方案2】:

      这是我的解决方案:

      if( !empty($this-companyEmail) ){
          $this->validate(new Email(
              array(
                  "field"   => "companyEmail",
                  "message" => "Email format error"
              )
          ));
      }
      

      我这样做是因为我通过 ajax 传递变量

      【讨论】:

        【解决方案3】:

        这是我对 Phalcon 3.4 的实现

        class SometimesOf extends \Phalcon\Validation\Validator\PresenceOf
        {
        
            public function __construct(array $options = null)
            {
                parent::__construct($options);
                $this->setOption('allowEmpty', true);
                
                if(!$this->hasOption('message')){
                    $this->setOption('message', 'Field :field cannot be empty');
                }
            }
        
            public function isAllowEmpty(Validation $validator, $field)
            {
                $keys = array_keys($validator->getData());
                return !in_array($field, $keys, true);
            }
        
        }
        

        并在验证器中将其用作...

        $validation->add('foo', new PresenceOf());
        
        $validation->add('bar', new SometimesOf());
        
        $messages = $validation->validate($data);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 2017-11-23
          • 1970-01-01
          • 1970-01-01
          • 2016-12-24
          • 2014-01-30
          • 1970-01-01
          相关资源
          最近更新 更多