CodeIgniter:验证依赖于其他提交变量的变量的简单方法

时间:2016-09-01 12:37:42

标签: php forms codeigniter validation refactoring

我有一张表格询问用户他们计划停留多长时间。我有两个字段:逗留的数量和这个数字的单位,即5天,1周等等。

我传递了两个变量:value_stayunit_stay

我希望使用特殊的商业规则验证它们,例如"允许最多停留3个月":

$this->form_validation->set_rules('unit_stay', 'stay unit', 'trim|required');
if(isset($_POST['unit_stay'])) {
    if($_POST['unit_stay'] === 'month') {
        $this->form_validation->set_rules('value_stay', 'stay value', 'less_than_equal_to[3]');
    }
}
$this->form_validation->set_rules('value_stay', 'stay value', 'trim|required|integer|greater_than_equal_to[1]');

我的问题是我对value_stay进行了冗余检查。 第二个set_rules()会覆盖条件中的那个。

CI Form Validation documentation中,不建议使用此类依赖项。

你们有什么特别的技巧可以重构这种特殊的验证吗?特别是如果依赖于value_stay的{​​{1}}验证可以缩短为与我所做的相比更紧凑和无冗余的黑客攻击。

1 个答案:

答案 0 :(得分:2)

您可以使用回调函数: http://www.codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

您的回调函数可能类似于:     $ this-> form_validation-> set_rules('value_stay','逗留值','trim | required | callback_stayToUnitCheck')

然后在同一个控制器中:

private function stayToUnitCheck($stay)
{
    $results = FALSE;
    // get the units
    // you have to get this additional one from the post variable
    if(!empty($_POST['unit_stay'])) 
    {
         $unit = $_POST['unit_stay'];
         switch ($stay)
         {
               case 'month':
                   // do your test on stay and unit
                   if ($unit <= 3) $result = TRUE;
                   break;
               case 'week':
                   // more tests
    }
    return $result;
}

当你掌握它们时,回调非常强大。您甚至可以为回调错误设置不同的消息:

$this->form_validation->set_message('stayToUnitCheck', 'For a stay of months you can only book a maximum of three months at a time.');

您可以在交换机中为每种不同类型的住宿设置,或在案例不匹配时使用默认消息。

希望有所帮助,

保罗。