【问题标题】:Codeigniter return validation error from helper functionCodeigniter 从辅助函数返回验证错误
【发布时间】:2026-02-12 13:25:01
【问题描述】:

我有一个辅助函数来检查用户名是否有效。

在帮助文件中:

if ( ! function_exists('valid_username'))
{
    function valid_username($username)
    {
        $ci=& get_instance();
        $ci->load->database(); 

        if (empty($username) OR !preg_match("/^[a-z]([0-9a-z_-])+[0-9a-z]$/i", $username)) //Allowed a-z, 0-9, and underscores. Must end in a-z or 0-9.
        {
            $ci->form_validation->set_message('valid_username', 'Characters not valid.');
            return FALSE;
        }

        $ci->db->select('username');
        $ci->db->where('username', $username);
        $ci->db->where('activated', 1);
        $ci->db->where('banned', 0);
        $ci->db->limit(1);
        $query = $ci->db->get('users');

        if ($query->num_rows() > 0) //if user exists
        {
            return TRUE;
        }
        else
        {
            $ci->form_validation->set_message('valid_username', 'The %s does not exist.');
            return FALSE;
        }
    }
}

在我的控制器中,我将助手添加到表单验证中:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|min_length[2]|max_length[50]|callback_valid_username');

//add callback from helper function
function valid_username($username)
{
    return valid_username($username);
}   

这很好用,但是我必须像这样将回调设为私有:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|min_length[2]|max_length[50]|callback__valid_username');

function _valid_username($username)
{
    return valid_username($username);
}   

将回调设为私有后,我在提交无效用户名时收到以下消息:

无法访问与您的字段名称对应的错误消息。

我在这里做错了什么?

【问题讨论】:

    标签: php forms validation codeigniter


    【解决方案1】:

    我不能 100% 确定为什么将函数设为私有会破坏您的错误消息,但我可以建议一种解决方法:

    表单验证规则允许将最多接受 1 个参数的任何函数用作验证或准备规则。所以基本上,当前脚本可用的任何东西都可以作为表单验证规则使用,包括你的valid_username() 函数。试试这个(只需将其添加到您的其他规则中):

    $this->form_validation->set_rules('username', 'Username', 'valid_username');
    

    因此,您不需要将控制器方法作为包装器,也不需要使用callback_
    看看这是否适合您。

    旁白:我建议在定义 valid_username() 时跳过 function_exists() 调用,除非您确定要允许“覆盖”函数”。

    【讨论】:

    • 谢谢!我不想使用回调,但由于某种原因,这个特殊的辅助函数在没有callback_ 的情况下无法处理表单验证规则。在set_message(_valid_username) 中添加下划线似乎是问题所在。
    【解决方案2】:

    您可以使用任何可调用的规则。即使它是助手中的函数。 Check it out

    正确的语法是:

    $this->form_validation->set_rules(
       'username', 'Username', array('required', array('valid_username_callable', 'valid_username')));
    

    在帮助程序中,如有必要,设置错误消息,如下所示:

    $CI = &get_instance();
    $CI->form_validation->set_message('valid_username_callable', 'Error message');
    

    【讨论】: