I am working in Laravel 5.4 and I have a slightly specific validation rules need but I think this should be easily doable without having to extend the class. Just not sure how to make this work..
What I would like to do is to make the 'music_instrument'
form field mandatory if program
array contains 'Music'
.
I found this thread How to set require if value is chosen in another multiple choice field in validation of laravel? but it is not a solution (because it never got resolved in the first place) and the reason it doesn't work is because the submitted array indexes aren't constant (not selected check boxes aren't considered in indexing the submission result...)
My case looks like this:
<form action="" method="post">
<fieldset>
<input name="program[]" value="Anthropology" type="checkbox">Anthropology
<input name="program[]" value="Biology" type="checkbox">Biology
<input name="program[]" value="Chemistry" type="checkbox">Chemistry
<input name="program[]" value="Music" type="checkbox">Music
<input name="program[]" value="Philosophy" type="checkbox">Philosophy
<input name="program[]" value="Zombies" type="checkbox">Zombies
<input name="music_instrument" type="text" value"">
<button type="submit">Submit</button>
</fieldset>
</form>
If I select some of the options from the list of check boxes I can potentially have this result in my $request
values
[program] => Array
(
[0] => Anthropology
[1] => Biology
[2] => Music
[3] => Philosophy
)
[music_instrument] => 'Guitar'
Looking at validation rules here: https://laravel.com/docs/5.4/validation#available-validation-rules I think something like his should work but i am literally getting nothing:
$validator = Validator::make($request->all(),[
'program' => 'required',
'music_instrument' => 'required_if:program,in:Music'
]);
I was hoping this would work too but no luck:
'music_instrument' => 'required_if:program,in_array:Music',
Thoughts? Suggestions?
Thank you!
The approach I took for a similar problem was to make a private function inside my Controller class and use a ternary expression to add the required field if it came back true.
I have roughly 20 fields that have a checkbox to enable the input fields in this case, so it may be overkill in comparison, but as your needs grow, it could prove helpful.
Using this function, you can apply the same logic if you have other fields for your other programs as well.
Then in the store function:
Haven't tried that, but in general array fields you usually write like this:
program.*
, so maybe something like this will work:If it won't work, obviously you can do it also in the other way for example like this:
You could create a new custom rule called
required_if_array_contains
like this...In app/Providers/CustomValidatorProvider.php add a new private function:
And don't forget to check there is a
use
statement at the top of CustomValidatorProvider.php for our use of Validator as an argument in our new method:Then in the boot() method of CustomValidatorProvider.php call your new private method:
Then teach Laravel to write the validation message in a human-friendly way by adding a new item to the array in resources/lang/en/validation.php:
Now you can write validation rules like this:
In the above example,
animals
is a group of checkboxes andanimals-other
is a text input that is only required if theother-mamal
orother-reptile
value has been checked.This would also work for a select input with multiple selection enabled or any input that results in an array of values in one of the inputs in the request.