Skip to content

Conditional Rules

Conditional validation rules control when fields are required based on other field values.

Rule Parameters Example Error Message
nullable $v->rule('nullable', 'field') {field} can be null or must be valid
optional $v->rule('optional', 'field') (always passes)
requiredWith fields, strict? $v->rule('requiredWith', 'field', 'other') {field} is required
requiredWithout fields, strict? $v->rule('requiredWithout', 'field', 'other') {field} is required

Note: Parameters marked with ? are optional.

Rule Missing Field Null Value Empty String
optional Skips validation Validates Skips validation
nullable Skips validation Skips validation Validates
Parameter Type Default Description
fields string|array Field(s) that trigger the requirement
strict bool false false = ANY field, true = ALL fields

Examples:

// Required if ANY field present
$v->rule('requiredWith', 'password', ['username', 'email']);
// Required if ALL fields present (strict mode)
$v->rule('requiredWith', 'suffix', ['first_name', 'last_name'], true);
// Either/or validation
$v->rule('requiredWithout', 'email', 'phone');
$v->rule('requiredWithout', 'phone', 'email');

Valicomb supports two syntax styles: rule-based (map rules to fields) and field-based (map fields to rules).

use Frostybee\Valicomb\Validator;
$v = new Validator($data);
$v->forFields([
'email' => [['requiredWithout', 'phone'], 'email'],
'phone' => [['requiredWithout', 'email'], 'phone'],
'parent_id' => ['nullable', 'integer'],
'bio' => ['optional', ['lengthMin', 10], ['lengthMax', 500]],
'website' => ['optional', 'url'],
'shipping_street' => [['requiredWith', 'use_different_shipping']],
'shipping_city' => [['requiredWith', 'use_different_shipping']],
'shipping_zip' => [['requiredWith', 'use_different_shipping']],
'card_cvv' => [['requiredWith', 'card_number'], ['length', 3]]
]);
$v->validate();
use Frostybee\Valicomb\Validator;
$v = new Validator($data);
$v->rules([
'nullable' => [
['parent_id'],
['manager_id']
],
'optional' => [
['middle_name'],
['bio'],
['website']
],
'requiredWith' => [
['shipping_street', 'use_different_shipping'],
['shipping_city', 'use_different_shipping'],
['shipping_zip', 'use_different_shipping'],
['card_cvv', 'card_number']
],
'requiredWithout' => [
['email', 'phone'],
['phone', 'email']
]
]);
$v->validate();