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


Set a form_validation rule from a library in CodeIgniter (PHP)

好的,所以我在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内容以调用规则(Form_validation.php"/system/"中的第 590 行),因此它最终不起作用;修改这个核心部分也很难,我宁愿不碰它,放弃了。

$this->负载>库("伏特/lbl_validation"); $this->imports('Lbl_validation'); 然后,您可以在控制器中使用 $this->method() 调用任何 $this->lbl_validation->method()

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

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

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

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

谢谢;)

处理验证的唯一好的 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...