在我的控制器的“存储”(POST)函数中,我想验证一个特定的输入字段。我有一个字段listPrice
,仅当另一个字段的值vendor
在数组中时才需要。供应商数组将需要从单独的服务调用中填充。所以,我的问题有两个:
- 我如何编写验证规则以要求
listPrice
如果vendor
的值包含在数组中并且 - 我什么时候会填充供应商的数组?它会在
store()
函数内部并在每次调用该函数时运行吗?验证规则位于控制器类的私有数组中,因此我相信它只创建一次,而不是每次store()
调用函数时。
在我的控制器的“存储”(POST)函数中,我想验证一个特定的输入字段。我有一个字段listPrice
,仅当另一个字段的值vendor
在数组中时才需要。供应商数组将需要从单独的服务调用中填充。所以,我的问题有两个:
listPrice
如果vendor
的值包含在数组中并且store()
函数内部并在每次调用该函数时运行吗?验证规则位于控制器类的私有数组中,因此我相信它只创建一次,而不是每次store()
调用函数时。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;
}
}
请记住还要注册您的自定义验证器解析器
要使用您的规则,您只需将供应商字段的属性名称作为参数传递。
2. 我认为这取决于需要阵列的位置以及频率。
如果仅需要此验证,我会在您的自定义验证规则中执行此操作,以避免为控制器堆积更多工作。
就我个人而言,我会将验证规则移至自定义验证器类,然后您可以将供应商数组作为该自定义验证器的字段。然后,此自定义验证器类将成为您的控制器使用的服务,请参阅https://tutsplus.com/lesson/validation-services/以获得一个很好的示例。
我自己没有测试过任何这些,但我相信它应该可以工作!抱歉,如果这不是最优雅的解决方案。