In my controller I have a store
method that is validating the request data:
$request->validate([
'title' => 'required',
'description' => 'required',
'date' => [
'required',
new DateFormatRule
],
'closed' => 'nullable',
'time_start' => 'required_if:closed,0',
'time_end' => [
'required_if:closed,0',
new TimeDurationRule($request->time_start)
],
]);
closed
is a boolean. If closed
is false, the time_start
and time_end
fields are required. This seems to be working as expected.
However, if I submit a request with closed
as true, I am getting caught in my custom TimeDurationRule
:
'time_end' => [
'required_if:closed,0',
new TimeDurationRule($request->time_start)
],
How can I make new TimeDurationRule($request->time_start)
conditional? For example, if closed
is true, I am manually setting time_end
to null
so time_start
/time_end
do not need a value (not required).
If I comment my custom rule out, everything works as expected.
Thank you for any suggestions!
You can pass $request->closed
to your TimeDurationRule
and then in the passes
method of the rule
, you can do something like this:
class TimeDurationRule implements Rule
{
public $closed;
public function __construct(/*all needed parameters*/, $closed)
{
$this->closed = $closed;
}
public function passes($attribute, $value)
{
if(!$closed){
return true
}
// the rest of validation logic
}
}
And then
new TimeDurationRule(/*all needed parameters*/, $request->closed)
You can read more about it here as well: https://laracasts.com/discuss/channels/laravel/create-custom-validation-rule-with-additional-parameters-implement-in-request
Hope it helps!