Home Articles

从CodeIgniter(PHP)中的库设置form_validation规则

Asked
Viewed 751 times
0

好的,所以我对 CodeIgniter flexibility 有一个大问题 . 我有很多个人规则(比如20)在一个庞大的项目中以一种形式定位输入 .

当我使用CodeIgniter的经典“callback_”系统时,一切正常 . 我只是将方法放在与表单检查相同的类中,并且它正确地检查它 .

我的问题是:

1)我想在另一个控制器中的另一个form_validation中使用所有这些规则,而无需复制/粘贴代码; we all know it's dirty/evil .

2)理想情况下,我很欣赏将这些规则放在一个大型库中,因为它需要800行,这不是一个好主意,让它在我的控制器中;正如我所说,这个项目非常庞大 .

它's 6 hours i'我正在寻找一个解决方案,绝对是 nothing clean

  • 我已经有一个 MY_Form_Validation 来提出一些一般规则,但我不喜欢将我的特定规则混合在一个全局类中的想法,这个规则每次都会徒劳无功 . 此外,这些规则包含许多库,模型,本机CI核心方法,例如$ this-> input-> post(),当我将所有内容放入此MY_Form_Validation时会产生错误 . 不是很好的解决方案:(

  • 我创建了一个 MY_Controller ,包括一个名为'imports'的方法,它在控制器中重新生成选定的库方法(在PHP4中,如果人们很好奇,它就像'aggregate_methods'函数一样);系统工作正常,但CodeIgniter最终没有工作;修改这个核心部分也很难,我更喜欢不接触它并且放弃了 .

$ this-> load-> library('volt / lbl_validation'); $这个 - >进口( 'Lbl_validation'); //然后你可以用控制器中的$ this-> method()调用任何$ this-> lbl_validation-> method()

  • 我试图破解CI在我的库中创建自定义的form_validation('lbl_validation');系统有点乱,但工作 . 问题是,当我回到CI form_validation系统来显示错误消息时,这是一个真正的意大利面条代码,但效果不佳 . Not the good solution either .

我也试过其他一些糟糕的解决方案,但我不想承认它 .

现在我在我的电脑前问自己 why bad things happened to good people ,为什么这么难以将set_rules与CodeIgniter中的被调用方法分开,为什么他们不需要将库方法作为规则来调用't plan ahead people could' . 我犹豫不决地把一个愚蠢的要求()放在某个地方,让它变得像我的办公桌一样脏乱 .

也许,有人有一个很好的dans清洁解决方案 . 我所有的希望都转向了StackOverFlow社区;某人?一个疯狂的CI极客?

谢谢 ;)

1 Answer

  • 3

    处理验证的唯一好的DRY方法是在保存到数据库之前将验证规则放在最后的位置,换句话说,在模型中 . 通过这样做,可以在任何控制器或库中使用相同的规则而无需重新定义 .

    以下想法来自Jamie Rumbelows优秀的Codeigniter手册:

    只需在模型中创建一个数组:

    $validate = array(
        array( 'field' => 'username', 'label' => 'Username', 'rules' => 'required,trim' ),
        array( 'field' => 'password', 'label' => 'Password', 'rules' => 'required|min_length[8]' )
    );
    

    然后实现一个方法,可以在save()之前验证数据

    function validate($data) {
        if (!empty($this->validate)) {
            foreach ($data as $key => $value) {
               $_POST[$key] = $value; }
               $this->load->library('form_validation');
               $this->form_validation->set_rules($this->validate);
               return $this->form_validation->run(); }
        else
        {
            return TRUE;
        } 
    }
    

    现在,在您的控制器中,您可以使用:

    if ($this->user->validate($user))
        save...
    

Related