Skip to content

Conditional Rules

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

RuleParametersExampleError Message
nullable$v->rule('nullable', 'field'){field} can be null or must be valid
optional$v->rule('optional', 'field')(always passes)
requiredWithfields, strict?$v->rule('requiredWith', 'field', 'other'){field} is required
requiredWithoutfields, strict?$v->rule('requiredWithout', 'field', 'other'){field} is required

Note: Parameters marked with ? are optional.

RuleMissing FieldNull ValueEmpty String
optionalSkips validationValidatesSkips validation
nullableSkips validationSkips validationValidates
ParameterTypeDefaultDescription
fieldsstring|arrayField(s) that trigger the requirement
strictboolfalsefalse = 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->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();
use Frostybee\Valicomb\Validator;
$v = new Validator($data);
$v->mapManyFieldsToRules([
'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();