【问题标题】:Yii2 validation, allow few different formatsYii2 验证,允许几种不同的格式
【发布时间】:2019-04-18 19:06:51
【问题描述】:

我想允许Yii2 ActiveRecord 中的字段有多种格式,例如:

public function rules()
{
    return [
        ['date', 'date', 'format' => 'php:Y-m-d H:i'],
        ['date', 'date', 'format' => 'php:Y-m-d'],
    ];
}

但是像这样,如果其中任何一个失败,它就会失败。我有什么办法可以做到rules?

目前我正在考虑在beforeValidate 中这样做:

public function beforeValidate()
{
    $this->date = date('Y-m-d H:i', strtotime($this->date));
    return parent::beforeValidate();
}

最好的方法是什么?

【问题讨论】:

  • 数据库中的字段类型是什么,我的意思是您使用的是文本类型的字段?并且您只想允许将所需的格式保存在数据库中并希望在模型级别对其进行控制
  • @MuhammadOmerAslam 字段类型为日期

标签: php validation activerecord yii2


【解决方案1】:

你可以通过制作函数来做到这一点,例如validateDateFormat()并处理其中的逻辑,然后在你说['date', 'validateDateFormat']的规则中,参考Yii的文档了解更多信息。

【讨论】:

    【解决方案2】:

    您可以创建自定义规则,它的工作原理是这样的。

    只需根据规则添加

    ['date','datefunction']
    
    public function datefunction($attribute,$params){
      $date      =   $this->$attribute;
    /*****check validation******/
    
     $this->addError($attribute, "Date : $date  Format is wrong");
    }
    

    注意:您可能会遇到数据库异常错误。保存文件后需要更改格式。

    【讨论】:

      【解决方案3】:

      您似乎想要匹配多种日期和时间格式?试试这个方法:

      ['date', 'match', 'pattern' => '#^(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)( ([01][0-9]|2[0-3]):([0-5][0-9]))?$#']
      

      【讨论】:

        猜你喜欢
        • 2015-11-07
        • 1970-01-01
        • 2023-02-19
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多