Skip to content

Error Messages

Valicomb provides flexible error message handling with custom messages, field labels, and message placeholders.

After validation runs, you’ll need to retrieve any errors that occurred. Valicomb provides several methods to access errors, whether you want all of them at once, errors for a specific field, or just need to check if validation passed.

$v = new Validator($_POST);
$v->rule('required', 'email');
$v->rule('integer', 'age');
if (!$v->validate()) {
$errors = $v->errors();
// [
// 'email' => ['Email is required'],
// 'age' => ['Age must be an integer']
// ]
}
$emailErrors = $v->errors('email');
// ['Email is required', 'Email is not a valid email address']
// Returns false if no errors for field
$nameErrors = $v->errors('name'); // false
if ($v->validate()) {
// All rules passed
$data = $v->data();
} else {
// At least one rule failed
$errors = $v->errors();
}

Default error messages work for most cases, but sometimes you need messages that match your application’s tone or provide more specific guidance. You can override any rule’s default message with your own.

Override the default message for a specific rule:

$v = new Validator($_POST);
$v->rule('required', 'email')->message('We need your email!');
$v->rule('email', 'email')->message("That doesn't look like a valid email");
$v->rule('required', 'password')
->message('Password cannot be empty')
->rule('lengthMin', 'password', 8)
->message('Password must be at least 8 characters long');

Placeholders let you create dynamic error messages that include the field name, the invalid value, and rule parameters. This makes error messages more informative without hardcoding values.

Error messages support placeholder substitution:

PlaceholderDescription
{field}The field name or custom label
{value}The actual value that failed validation
%s, %dsprintf-style placeholders for rule parameters
$v->rule('lengthBetween', 'username', 3, 20)
->message('{field} must be between %d and %d characters');
// Result: "Username must be between 3 and 20 characters"
$v->rule('min', 'age', 18)
->message('{field} must be at least %s years old');
// Result: "Age must be at least 18 years old"

Include the actual failed value in error messages for more helpful feedback:

$v = new Validator(['email' => 'not-an-email']);
$v->rule('email', 'email')
->message('{field} "{value}" is not a valid email address');
$v->validate();
// Error: 'Email "not-an-email" is not a valid email address'

The {value} placeholder automatically formats different types:

TypeDisplay
StringThe string value
Integer/FloatThe numeric value
null”null”
true”true”
false”false”
ArrayJSON representation
DateTime”Y-m-d H:i:s” format
ObjectClass name
// String value
$v = new Validator(['code' => 'ABC']);
$v->rule('integer', 'code')->message('{field} "{value}" must be an integer');
// Error: 'Code "ABC" must be an integer'
// Null value
$v = new Validator(['field' => null]);
$v->rule('required', 'field')->message('{field} cannot be {value}');
// Error: 'Field cannot be null'
// Boolean value
$v = new Validator(['active' => true]);
$v->rule('email', 'active')->message('{field} value {value} is invalid');
// Error: 'Active value true is invalid'
// Numeric value
$v = new Validator(['age' => 15]);
$v->rule('min', 'age', 18)->message('{field} "{value}" must be at least %s');
// Error: 'Age "15" must be at least 18'
$v = new Validator(['score' => 150]);
$v->rule('max', 'score', 100)
->message('{field} value "{value}" exceeds maximum of %s')
->label('Player Score');
$v->validate();
// Error: 'Player Score value "150" exceeds maximum of 100'

When adding errors programmatically, pass the value as the fourth parameter:

$v = new Validator(['username' => 'admin']);
// Custom validation
if ($username === 'admin') {
$v->error('username', '{field} "{value}" is reserved', [], 'admin');
}
// Error: 'Username "admin" is reserved'

Field names in your code often use snake_case or technical names that don’t look great in user-facing error messages. Labels let you define human-readable names that appear in error messages instead.

Make error messages more user-friendly with custom field labels.

$v->rule('required', 'email_address')
->label('Email Address');
// Error: "Email Address is required" instead of "Email address is required"
$v->labels([
'email' => 'Email Address',
'password' => 'Password',
'first_name' => 'First Name',
'last_name' => 'Last Name'
]);
$v = new Validator($_POST);
$v->labels([
'user_email' => 'Email Address',
'user_pass' => 'Password'
]);
$v->rule('required', ['user_email', 'user_pass']);
$v->rule('email', 'user_email');

In some contexts (like API responses or single-field forms) you may not want field names prepended to error messages. You can disable this behavior globally for a validator instance.

By default, error messages are prefixed with the field name. You can disable this:

$v = new Validator(['email' => 'invalid']);
$v->setPrependLabels(false);
$v->rule('email', 'email');
$v->validate();
// Error: "is not a valid email address" (no "Email" prefix)
  • Building JSON API responses where you already know the field
  • Custom error display where you show field names separately
  • Single-field forms

Sometimes you need to add errors based on custom logic that isn’t covered by built-in rules—like checking against a database or validating business rules. You can add errors programmatically and they’ll be included with the other validation errors.

Add custom errors programmatically:

$v = new Validator($_POST);
// Custom validation logic
if ($someCustomCondition) {
$v->error('field_name', 'This field failed custom validation');
}
// With sprintf placeholders
$v->error('age', 'Must be between %d and %d', [18, 65]);
// With {value} placeholder (pass value as 4th parameter)
$v->error('username', '{field} "{value}" is not allowed', [], $username);

How you display errors depends on your application’s UI. Here are common patterns for rendering validation errors in different contexts.

if (!$v->validate()) {
echo '<ul class="errors">';
foreach ($v->errors() as $field => $messages) {
foreach ($messages as $message) {
echo "<li>$message</li>";
}
}
echo '</ul>';
}
function displayFieldError($v, $field) {
$errors = $v->errors($field);
if ($errors) {
return '<span class="error">' . $errors[0] . '</span>';
}
return '';
}
// In your form
echo '<input name="email">' . displayFieldError($v, 'email');
if (!$v->validate()) {
http_response_code(422);
echo json_encode([
'success' => false,
'errors' => $v->errors()
]);
exit;
}
if (!$v->validate()) {
$allErrors = $v->errors();
$firstField = array_key_first($allErrors);
$firstError = $allErrors[$firstField][0];
echo $firstError;
}

Valicomb includes translations for 33 languages out of the box. You can set the language globally or per-instance to display error messages in your users’ preferred language.

Error messages support multiple languages:

// Set global language
Validator::lang('es'); // Spanish
// Or per-instance
$v = new Validator($data, [], 'fr'); // French

See Internationalization Guide for more details.