【问题标题】:As in Kohana 3.3 add a rule on the fly?就像在 Kohana 3.3 中那样动态添加规则?
【发布时间】:2015-09-29 05:52:00
【问题描述】:

就像在 Kohana 3.3 中那样动态添加规则?即例如在保存模型User之前,如果满足某个条件,则需要添加规则city_id模型不能为空,试试这个:

if (Arr::get($data, 'val') > 0){
                    ORM::factory('User')->rules(array('city_id, array(array('not_empty'), array('digit'))));
                }

            try {
                $this->user->update_user($data);
            } catch (ORM_Validation_Exception $e) {
                $errors = $e->errors('Validation');
           }

在任何情况下都绕过,即通常它不起作用

【问题讨论】:

    标签: php kohana kohana-3


    【解决方案1】:

    首先,你甚至试图用错:

    ORM::factory('User')->rules(array ('city_id, array (array (' not_empty '), array (' digit '))));
    

    至少应该有以下几点:

    ORM::factory('User')->rules(array ('city_id => array (array (' not_empty '), array (' digit '))));
    

    不干预代码行不通,我会解释...

    在 ORM 中:

    public function rules()
    {
        return array ();
    }
    

    我们在模型中覆盖的对象。

    即使是记录也意味着对模型中已有内容的重新定义。

    ORM::factory('User')->rules(array ('city_id => array (array (' not_empty '), array (' digit '))));
    

    但是两者都不能添加所需的方法Class ORM:

    public function addRules($a2){
        $a1 = $ this->rules();
        return array_merge_recursive ($a1,$a2);
    }
    

    然后我们得到以下信息:

    ORM::factory('User')->addRules(array ('city_id => array (array (' not_empty '), array (' digit '))));
    

    很酷,但它不起作用,如下所示:

    /**
         * Initializes validation rules, and labels
         *
         * @return void
         */
        protected function _validation()
        {
            // Build the validation object with its rules
            $this->_validation = Validation::factory($this->_object)
                ->bind(':model', $this)
                ->bind(':original_values', $this->_original_values)
                ->bind(':changed', $this->_changed);
    
            foreach ($this->rules() as $field => $rules)
            {
                $this->_validation->rules($field, $rules);
            }
    
            // Use column names by default for labels
            $columns = array_keys($this->_table_columns);
    
            // Merge user-defined labels
            $labels = array_merge(array_combine($columns, $columns), $this->labels());
    
            foreach ($labels as $field => $label)
            {
                $this->_validation->label($field, $label);
            }
        }
    

    它仍然导致rules(),这是模型...

    您可以继续思考,但我建议您利用外部验证

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2014-08-09
      • 2016-09-27
      • 2013-12-05
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多