Te recomendamos que pruebes esta respuesta en un entorno controlado antes de enviarlo a producción, saludos.
Solución:
No lo he probado, pero en general array campos que normalmente escribes así: program.*
así que tal vez algo como esto funcione:
$validator = Validator::make($request->all(),[
'program' => 'required',
'music_instrument' => 'required_if:program.*,in:Music'
]);
Si no funciona, obviamente también puedes hacerlo de la otra manera, por ejemplo, así:
$rules = ['program' => 'required'];
if (in_array('Music', $request->input('program', [])))
$rules['music_instrument'] = 'required';
$validator = Validator::make($request->all(), $rules);
Podría crear una nueva regla personalizada llamada required_if_array_contains
Me gusta esto…
En app/Providers/CustomValidatorProvider.php agregue una nueva función privada:
/**
* A version of required_if that works for groups of checkboxes and multi-selects
*/
private function required_if_array_contains(): void
$this->app['validator']->extend('required_if_array_contains',
function ($attribute, $value, $parameters, Validator $validator)
// The first item in the array of parameters is the field that we take the value from
$valueField = array_shift($parameters);
$valueFieldValues = Input::get($valueField);
if (is_null($valueFieldValues))
return true;
foreach ($parameters as $parameter)
if (in_array($parameter, $valueFieldValues) && strlen(trim($value)) == 0)
// As soon as we find one of the parameters has been selected, we reject if field is empty
$validator->addReplacer('required_if_array_contains', function($message) use ($parameter)
return str_replace(':value', $parameter, $message);
);
return false;
// If we've managed to get this far, none of the parameters were selected so it must be valid
return true;
);
Y no te olvides de comprobar que hay un use
declaración en la parte superior de CustomValidatorProvider.php para nuestro uso de Validator como argumento en nuestro nuevo método:
...
use IlluminateValidationValidator;
Luego, en el método boot() de CustomValidatorProvider.php llame a su nuevo método privado:
public function boot()
...
$this->required_if_array_contains();
Luego, enseñe a Laravel a escribir el mensaje de validación de una manera amigable para los humanos agregando un nuevo elemento al array en recursos/lang/en/validation.php:
return [
...
'required_if_array_contains' => ':attribute must be provided when ":value" is selected.',
]
Ahora puedes escribir reglas de validación como esta:
public function rules()
return [
"animals": "required",
"animals-other": "required_if_array_contains:animals,other-mamal,other-reptile",
];
En el ejemplo anterior, animals
es un grupo de casillas de verificación y animals-other
es una entrada de texto que solo se requiere si el other-mamal
o other-reptile
se ha comprobado el valor.
Esto también funcionaría para una entrada de selección con selección múltiple habilitada o cualquier entrada que resulte en una array de valores en una de las entradas en la solicitud.
El enfoque que tomé para un problema similar fue crear una función privada dentro de mi clase de Controlador y usar una expresión ternaria para agregar el campo requerido si volvía true.
Tengo aproximadamente 20 campos que tienen una casilla de verificación para habilitar los campos de entrada en este caso, por lo que puede ser excesivo en comparación, pero a medida que crezcan sus necesidades, podría resultar útil.
/**
* Check if the parameterized value is in the submitted list of programs
*
* @param Request $request
* @param string $value
*/
private function _checkProgram(Request $request, string $value)
if ($request->has('program'))
return in_array($value, $request->input('program'));
return false;
Con esta función, puede aplicar la misma lógica si también tiene otros campos para sus otros programas.
Luego en la función de tienda:
public function store(Request $request)
$this->validate(request(), [
// ... your other validation here
'music_instrument' => ''.($this->_checkProgram($request, 'music') ? 'required' : '').'',
// or if you have some other validation like max value, just remember to add the