Laravel“required_if”字段值包含在数组中

时间:2013-07-30 21:48:42

标签: php validation laravel laravel-4

在我的控制器"商店" (POST)功能,我想验证一个特定的输入字段。我有一个字段listPrice,只有当另一个字段vendor的值在数组中时才需要。需要从单独的服务调用填充供应商阵列。所以,我的问题有两个:

  1. 如果listPrice的值包含在数组中且
  2. ,如何编写验证规则以要求vendor
  3. 我什么时候会填充供应商的数组?它会在store()函数内部并在每次调用该函数时运行吗?验证规则位于控制器类的私有数组中,因此只有在我相信时才会创建,而不是每次调用store()函数时都会创建。

1 个答案:

答案 0 :(得分:3)

1。 如果您可以从laravel的验证器访问$ this [data],这将非常简单,但如果您只是使用Validator :: extend来自定义规则,我认为您无法做到。您也无法从规则中访问其他验证规则,这些规则在这里可以派上用场。所以最干净的可能是扩展验证器类。

class CustomValidator extends Illuminate\Validation\Validator {

    public function validateIfInVendorArray($attribute, $value, $parameters)
    {
    $other = $parameters[0];
    $vendor = $this->data[$other];

    //populate your array from your service call, then check if present
    $vendorArray = your service call or wherever you have it;

    //if in array, return the result of the Validator's validateRequired method, which we can access since it's protected in Validator        
    if (in_array($vendor,$vendorArray))
        return $this->validateRequired($attribute,$value);

    //if it wasn't in the array, return true to pass validation even if it doesn't exist
    return true;
    }
}

请记住register your custom validator resolver

要使用您的规则,您只需将供应商字段的属性名称作为参数传递。

2。 我认为这取决于您的阵列需要的位置以及频率。

如果只需要进行此验证,我会在您的自定义验证规则中执行此操作,以避免为控制器堆积更多工作。

我个人会将验证规则移到自定义验证器类,然后您可以将供应商数组作为该自定义验证器的字段。然后,这个自定义验证器类将成为您的控制器使用的服务,请参阅https://tutsplus.com/lesson/validation-services/以获得一个很好的示例。

我自己没有测试过这些,但我相信它应该有效!对不起,如果这不是最优雅的解决方案。