【问题标题】:CodeIgniter Form Validation callback to model from config rules?CodeIgniter 表单验证回调从配置规则到模型?
【发布时间】:2018-02-01 08:04:59
【问题描述】:

我的 User_model 有一个名为 is_unique_email($email) 的公共方法。此方法检查用户是否具有带有一些状态标志检查的唯一邮件地址。这也是我不能使用 CodeIgniter 的标准 is_unique 验证规则的原因。

我正在为我的验证规则组使用带有配置数组的 form_validation.php。我的问题是:如何调用模型方法来检查新用户的电子邮件地址?我搜索并尝试了很多东西,但没有任何效果。我的首选电话是 |管道分隔符。

Like:trim|required|max_length[70]|valid_email|

这个回调有什么解决办法还是没有办法,我必须扩展Form_validation系统库?

我正在使用 CodeIgniter 3.1.7。

提前致谢!

【问题讨论】:

    标签: forms codeigniter validation codeigniter-3


    【解决方案1】:

    更新:

    因为我总是通过扩展 form_validation 库来做事,所以我忘记了这一点:

    https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

    还有这个(匿名函数):

    https://codeigniter.com/user_guide/libraries/form_validation.html#callable-use-anything-as-a-rule

    可能对你更好。如有疑问,请务必阅读文档;)


    是的,您可以扩展 form_validation 库。在application/library 中创建一个MY_Form_validation.php 并让它像这样扩展CI:

    class MY_Form_validation extends CI_Form_validation {
    

    然后你可以在里面做这样的事情:

    /**
     * Checks to see if bot sum is valid 
     * e.g. equals the session stored values
     * 
     * @param int $sum
     * @return boolean
     */
    public function valid_bot_sum($sum) {
        $generated = $this->CI->session->bot_first_number + $this->CI->session->bot_second_number;
        if ($generated !== intval($sum)) {
            $this->set_message('valid_bot_sum', 'Invalid bot sum.');
            return false;
        } else {
            return true;
        }
    }
    

    现在可以通过管道分隔符访问您的函数,就像任何本机 form_validation 验证函数一样。请务必像我所做的那样将消息设置为 false,否则您将收到错误消息。你可以像$this->CI这样访问CI实例。

    在您的情况下,您可以将模型中的函数迁移到此文件中,也可以通过在函数中加载模型并调用函数并测试它是否评估为真/假并处理为以上。

    【讨论】:

    • 我已经尝试了文档中的第二个(可调用:使用任何规则)。但是在配置 form_validation.php 中没有任何东西起作用:(
    • 代码应该在控制器中,而不是在配置中。您可以在构造函数中实例化配置/规则,然后使用可调用函数对其进行扩展。
    • 目前我已经扩展了 CI_Form_validation 类。首先,我尝试使用 __call 类方法来处理这个问题。稍后使用 model_validator[User_model->is_unique_email] 和 model_validator($value, $action) 方法。但我总是尝试调用 $this->CI->$action 发生错误。只有在我使用精确的 $this->CI->User_model... 调用创建静态公共方法之后,它才能工作。但它 - 我认为是 - 根本不是从模型中复制所有验证方法的最佳解决方案。所以我愿意寻求更好的解决方案:)
    • 您的问题是关于是否可以添加额外的表单验证规则。我给你看了。如果您有其他问题或与所述方法的实施相关的问题,则 cmets 不是用于添加问题或其他调试。文档非常清晰,尤其是:“回调:您自己的验证方法”,我认为这对您很有效,而且他们的解释比我做得更好。
    • 完全错过了“form_validation.php with config array for my validation”这一行,你的意思是你没有做$this->form_validation->set_rules('some_field', 'Some field', valid_email|some_callback,但你正在做:codeigniter.com/userguide3/libraries/…/codeigniter.com/userguide3/libraries/…?你为什么不直接在本地迁移规则(你经常使用它们?)?在这种情况下,我上面的方法是真正做到这一点的唯一方法(从 cmets 你也这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多