Вы можете использовать расширение Validator для создания собственного валидатора:
В AppServiceProvider
введите этот код: (или в любом провайдере)
public function boot(){
Validator::extend('present_only_one_from', function ($attribute, $value, $params, $validator) {
// $params = [user,customer,public]
$data = array_keys(array_filter($validator->getData())); // or you can write request()->all()
// $data = [user,customer] or [user,customer,public] or [user] ...
$intersect = array_intersect($data, $params); // returns matches of received and in validation rules
// $intersect [user,customer] && [user,customer,public] => [user,customer] => invalid
// $intersect [user] && [user,customer,public] => [user] => ($intersect[0] !== $attribute) => valid
// $intersect [customer] && [user,customer,public] => [customer] => ($intersect[0] !== $attribute) => invalid
if (count($intersect) != 1 && $intersect[0] !== $attribute) return false;
return true;
});
}
Пользовательский validator Closure получает четыре аргумента: имя проверяемого атрибута $, значение атрибута $, массив параметров, передаваемых правилу, и экземпляр Validator.
Затем в любом контроллере Вы можете использовать эти правила:
$validator = Validator::make($request->request->all(), [
'user' => 'present_only_one_from:user,customer,public',
'customer' => 'present_only_one_from:user,customer,public',
'public' => 'present_only_one_from:user,customer,public',
]);
надеюсь, это поможет вам