【问题标题】:Custom validation in codeigniter 3codeigniter 3 中的自定义验证
【发布时间】:2016-07-12 13:17:02
【问题描述】:

我不喜欢 codeigniter 的一点是控制器内部的验证逻辑,很容易增加和弄乱代码。为了将这个逻辑与控制器分开,我创建了一个导入 form_validation library 的模型:

Class BS_Validator extends CI_Model 
{ 
    protected $rules = array(); 
    protected $fields = array();

    # Get keys of fields.
    public function getStructure()
    {
        return array_keys( $this->fields );
    }

    # Validate $_POST against the rules and fields.
    public function validate()
    {
        $this->load->library('form_validation');

        foreach( $this->rules as $key => $rule )
        {
            $this->form_validation->set_rules( $key, $this->fields[$key], $rule );
        }

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

对于每个验证,我都扩展了这个类:

class User_Create extends BS_Validator
{
    protected $fields = array(
        'name' => 'Nome',
        'email' => 'Email',
        'password' => 'Senha',
        'password_repeat' => 'Repetir senha'
    );

    protected $rules = array(
        'name' => 'required|min_length[3]|max_length[50]',
        'email' => 'required|min_length[8]|max_length[100]|valid_email|is_unique[users.email]',
        'password' => 'required',
        'password_repeat' => 'required|callback_password_repeat_check'
    );

    public function password_repeat_check ($password_repeat)
    {
        return true;
    }
}

一切都像一个魅力,除了自定义验证方法,从不调用。在这种特定情况下,它总是返回 (pasword_repeat_check) 错误。

这个方法被识别该怎么办?

【问题讨论】:

  • 为什么没有在配置库中创建form_validation.php?所以所有的验证规则都将保存在一个位置,它是 codeigniter 的内置函数
  • 既然您使用的是 Codeigniter 3 - 您看过 Callable 了吗? codeigniter.com/user_guide/libraries/…
  • 是的,它也不起作用。也许这是我创建的包装器BS_Validator 的问题。

标签: php codeigniter validation


【解决方案1】:

无法让它以这种方式工作。

我使用的替代方法是在libraries 文件夹上创建一个文件MY_form_validation.php 以扩展Form_validation 类。

class BS_Form_validation extends CI_Form_validation
{
    protected $CI;

    function __construct($rules = array())
    {
        parent::__construct($rules);
    }

    public function password_repeat ($password_repeat)
    {
        return $_POST['password'] == $password_repeat;
    }
}

这样我可以创建rules而不是callback rules,它可以被如下调用(不需要callback_前缀):

protected $rules = array(
        'name' => 'required|min_length[3]|max_length[50]',
        'email' => 'required|min_length[8]|max_length[100]|valid_email|is_unique[users.email]',
        'password' => 'required',
        'password_repeat' => 'required|password_repeat'
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多