好的,所以我对 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行),因此它最终不起作用;修改这个核心部分也很难,我更喜欢不接触它并放弃。
$这 - >负载>库( '伏特/ lbl_validation'); $这 - >进口( 'Lbl_validation'); //然后你可以用控制器中的$ this-> method()调用任何$ this-> lbl_validation->方法()
我也试过其他一些糟糕的解决方案,但我不想承认它。
现在我在电脑前问自己好人为什么会发生坏事,为什么这很难将set_rules与CodeIgniter中的被调用方法分开,为什么他们没有提前计划人们可能需要将库方法称为规则。我不知道该怎么做,我在犹豫要把一个愚蠢的要求()放在某个地方,让它像我的办公桌一样肮脏和凌乱。
也许,有人有一个很好的dans清洁解决方案。我所有的希望都转向了StackOverFlow社区;某人?一个疯狂的CI极客?
谢谢;)
答案 0 :(得分:3)
处理验证的唯一好方法是在保存到数据库之前将验证规则放在最后的位置,换句话说就是在模型中。通过这样做,可以在任何控制器或库中使用相同的规则而无需重新定义。
以下想法来自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...