Codeigniter:未执行自定义验证

Codeigniter: Custom validation is not executed

我正在尝试创建我的自定义验证,如果选择了某个选项,则需要客户 ID。现在,我只想测试自定义验证是否有效,所以我不关心选项,只设置消息并且始终 return false。出于 MVC 模式的原因,我不想将验证放在我的控制器中。如果我的自定义验证放在模型中,它就不起作用,所以我在名为 MY_Form_validation.

的库文件夹中创建了一个新的验证文件

MY_Form_validation.php

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Form_validation extends CI_Form_validation
{
    protected $CI;

    function __construct($rules = array())
    {
        parent::__construct($rules);
    }
    
    public function customer_required($str)
    {
        $this->set_message('customer_required', 'Customer is required if you choose option A');
        return false;
    }
}

在模型中,我这样称呼它:

public function save()
{
    /* other form validation */

    $this->form_validation->set_rules('customer_id', 'Customer', 'customer_required');

    return $this->form_validation->run();
}

我也放在了自动加载

$autoload['libraries'] = array('session','database','table','form_validation', 'MY_Form_validation');

它应该总是无法保存,因为只有验证 return 错误。但看起来自定义验证根本没有执行,因为它总是 return true。我错过了什么吗?已经好几天了,我仍然不知道我哪里做错了。请帮忙。

更新

正如 Marleen 所建议的,我尝试使用 callable,但又一次,函数 check_customer 似乎没有执行,因为我已成功保存。

Customer_model

$this->form_validation->set_rules('customer_is_required', array($this->customer_model, 'check_customer'));
$this->form_validation->set_message('customer_is_required', 'Customer is required of you choose option A');

private function check_customer()
{
    return false;
}

您的方法未被触发,因为您的 customer_id 字段提交为空。 Codeigniter 不会验证空字段,除非规则是 required/isset/matches 或回调或可调用规则之一。 (参见 Form_validation.php 第 700 行。)

如果您将规则指定为可调用规则,它可以保留在模型中并执行,即使提交的字段为空:

$this->form_validation->set_rules('customer_id', 'Customer', array(
    array($this->your_model, 'customer_required')
));

(另请参阅:https://codeigniter.com/userguide3/libraries/form_validation.html#callable-use-anything-as-a-rule


$this->form_validation->set_rules('customer_is_required', 'Customer', array(
    array($this->customer_model, 'check_customer')
));

public function check_customer($str) {
    return false;
}

要添加消息,请使用:

  $this->form_validation->set_rules('customer_is_required', 'Customer', array(
    array('customer_is_required', array($this->customer_model, 'check_customer'))
  ));
  $this->form_validation->set_message('customer_is_required', 'Customer is required of you choose option A');