在我的控制器"商店" (POST)功能,我想验证一个特定的输入字段。我有一个字段listPrice
,只有当另一个字段vendor
的值在数组中时才需要。需要从单独的服务调用填充供应商阵列。所以,我的问题有两个:
listPrice
的值包含在数组中且vendor
store()
函数内部并在每次调用该函数时运行吗?验证规则位于控制器类的私有数组中,因此只有在我相信时才会创建,而不是每次调用store()
函数时都会创建。答案 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/以获得一个很好的示例。
我自己没有测试过这些,但我相信它应该有效!对不起,如果这不是最优雅的解决方案。