0

好的,所以我在CodeIgniter 灵活性方面遇到了一个大问题。我有许多个人规则(如 20 条)针对大型项目中表单中的输入。

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

我的问题是:

1)我想在另一个控制器的另一个 form_validation 中使用所有这些规则,而无需复制/粘贴代码;我们都知道这是肮脏/邪恶的

2) 理想情况下,我希望将这些规则放在一个大库中,因为它需要大约 800 行,而将其放在我的控制器中并不是一个好主意;正如我所说,这个项目非常庞大。

我正在寻找解决方案 6 小时,但绝对没有什么干净的:

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

  • 我创建了一个MY_Controller,包括一个名为“imports”的方法,该方法在控制器中重新生成选定的库方法(在 PHP4 中,如果人们好奇,它是一种“aggregate_methods”函数);该系统运行良好,但 CodeIgniter 不理解它。这些方法可以在控制器内调用,但似乎框架检查 $CI 内容以调用规则('/system/' 中的 Form_validation.php 第 590 行),因此它最终不起作用;这个核心部分也很难修改,我宁愿不碰它也放弃了。

$this->load->library('volt/lbl_validation'); $this->imports('Lbl_validation'); // 然后你可以在控制器中使用 $this->method() 调用任何 $this->lbl_validation->method()

  • 我试图破解 CI 在我的库中创建一个自定义的 form_validation ('lbl_validation');该系统有点混乱,但工作正常。问题是当我回到 CI form_validation 系统显示错误消息时,它是一个真正的意大利面条代码,它运行得不是很好。也不是好的解决方案

我还尝试了其他一些糟糕的解决方案,但我不想承认。

现在我在电脑前问自己为什么坏事会发生在好人身上,为什么很难将 set_rules 与 CodeIgniter 中的调用方法分开,为什么他们没有提前计划人们可能需要调用库方法作为规则。我不知道该怎么做,我正在犹豫是否将一个愚蠢的 require() 放在某个地方,让它像我现在的办公桌一样变得又脏又乱。

也许,有人有一个好的 dans clean 解决方案。我所有的希望都寄托在 StackOverFlow 社区;有人?一个疯狂的 CI 极客?

谢谢 ;)

4

1 回答 1

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...
于 2013-09-15T15:36:08.967 回答