无法找到自定义回调验证规则(CodeIgniter 3 HMVC)

时间:2016-06-23 11:40:02

标签: php validation codeigniter-3

EDIT2:向下滚动查看最新信息!

在CodeIgniter 3中,我最近将所有控制器的回调规则移至application/libraries/MY_Form_validation.php以防止代码重复等,并进行清理。

现在,它们似乎不再起作用了。

MY_Form_validation.php就像这样开始:

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

class MY_Form_validation extends CI_Form_validation
{
    public $CI;

    function run($module = '', $group = '')
    {
        log_message('debug',"Now running the MY_Form_validation");
        (is_object($module)) AND $this->CI = &$module;
        return parent::run($group);
    }

然后是一个完整的回调函数列表,全部定义为public function callback_name(){}

我还有一个(在同一个类中)检查提供的用户登录信息是否正确(因此,如果用户可以登录等),但表单验证无法找到规则。

错误日志如下所示:

INFO - 2016-06-23 13:33:18 --> Form Validation Class Initialized
DEBUG - 2016-06-23 13:33:18 --> Now running the MY_Form_validation
INFO - 2016-06-23 13:33:18 --> Language file loaded: language/english/form_validation_lang.php
DEBUG - 2016-06-23 13:33:18 --> Unable to find callback validation rule: check_database

第一个DEBUG消息表明已加载MY_Form_validation(因为它使用了覆盖的run()方法,因此调试日志记录),但它无法找到下面明确定义的回调函数。 / p>

我还包含语言文件application/language/english/form_validation_lang.php,其中包含以下行:

$lang['form_validation_check_database'] = 'The password does not match the username. Try again.';,它正确捕获(即在执行表单验证时显示此消息),但它本身无法找到回调函数。

编辑:我检查了方法是否未正确继承:

    public function __construct($rules = array())
    {
    $this->CI =& get_instance();
    var_dump(get_class_methods($this));

var_dump()会输出正确的完整数组方法,包括我自己的自定义回调和内置方法。

EDIT2: 我阅读了system/libraries/Form_validation.php并调查了调试消息的发生位置,可以在此代码示例中看到(第734-749行):

    // Call the function that corresponds to the rule
    if ($callback OR $callable !== FALSE)
    {
        if ($callback)
        {
            if ( ! method_exists($this->CI, $rule))
            {
                log_message('debug', 'Unable to find callback validation rule: '.$rule);
                $result = FALSE;
            }
            else
            {
                // Run the function and grab the result
                $result = $this->CI->$rule($postdata, $param);

            }
        }

似乎只在主CI对象中查找回调,而不是在表单验证库本身中查找。我可以添加一些可以选择库回调的hacky异常,但我怀疑这是最好的事情,我想我忽略了一些简单的事情......

如果需要任何其他信息,请告知我们。

2 个答案:

答案 0 :(得分:0)

好吧,我发现了......

显然,只要将回调函数移动到MY_Form_validation.php,它们实际上就是内置验证规则,并且不再充当回调。

设置表单规则时,我仍然应用了回调_ 前缀,这使得Form_validation库在普通CI对象(即控制器)中查找规则而不是(MY_)Form_validation类。

我的修复是简单地从应用的验证规则设置中删除此前缀。现在它发现'回调'功能正确。

答案 1 :(得分:0)

请尝试这个

<?php

class Form extends CI_Controller {

        public function index()
        {
                $this->load->helper(array('form', 'url'));

                $this->load->library('form_validation');

                $this->form_validation->set_rules('username', 'Username', 'callback_username_check');
                $this->form_validation->set_rules('password', 'Password', 'required');
                $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
                $this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]');

                if ($this->form_validation->run() == FALSE)
                {
                        $this->load->view('myform');
                }
                else
                {
                        $this->load->view('formsuccess');
                }
        }

        public function username_check($str)
        {
                if ($str == 'test')
                {
                        $this->form_validation->set_message('username_check', 'The {field} field can not be the word "test"');
                        return FALSE;
                }
                else
                {
                        return TRUE;
                }
        }

}

?>