Use setRule() when one field owns a small rule list.
use Quantum\Validation\Rule;
use Quantum\Validation\Validator;
$validator = new Validator();
$validator->setRule('email', [
Rule::required(),
Rule::email(),
]);
$isValid = $validator->isValid([
'email' => 'jane@example.com',
]);Each Rule::...() call returns the rule shape that Validator expects.
setRules() is the normal choice for form or request validation.
$validator->setRules([
'email' => [
Rule::required(),
Rule::email(),
Rule::unique(User::class, 'email'),
],
'password' => [
Rule::required(),
Rule::minLen(6),
],
'confirm_password' => [
Rule::required(),
Rule::same('password'),
],
]);
if (!$validator->isValid($request->all())) {
return response()->json([
'errors' => $validator->getErrors(),
], 422);
}Rules stay on the validator instance until you change them.
$validator->setRule('title', [
Rule::minLen(10),
Rule::maxLen(100),
]);
$validator->updateRule('title', Rule::minLen(5));
$validator->deleteRule('title', 'maxLen');Use flushRules() when you want to clear both rules and collected errors before reusing the object for a different validation job.
Custom rules are closures registered by name.
$validator->addRule('allowedDomain', function ($value, string $domain): bool {
return str_ends_with((string) $value, '@' . $domain);
});
$validator->setRule('email', [
Rule::required(),
Rule::allowedDomain('example.com'),
]);If the rule name used in setRule() or setRules() does not exist as a built-in method or registered custom rule, validation throws BadMethodCallException.
File rules work on UploadedFile objects, so validate the normalized request payload rather than raw $_FILES arrays.
$validator->setRule('image', [
Rule::fileSize(1_000_000),
Rule::fileExtension('jpg', 'jpeg', 'png'),
Rule::imageDimensions(1200, 630),
]);
if (!$validator->isValid($request->all())) {
return ['errors' => $validator->getErrors()];
}A few practical caveats matter here:
fileSize()compares byte countsfileMimeType()uses the detected MIME type from the uploaded file contentsimageDimensions()expects a real image upload and may bubble a storage exception for non-image input- if the upload field is missing entirely, typed file rules do not skip it automatically
getErrors() returns errors grouped by field.
$errors = $validator->getErrors();Each message is built through the Lang package using:
validation.<rule>for the rule messagecommon.<field>for the field label
That means translated output depends on those translation keys being available in your active language files.
Optional text fields work only when their other rules accept an empty string.
$validator->setRule('display_name', [
Rule::maxLen(50),
]);This passes when display_name is missing because the package substitutes '' and maxLen(50) still succeeds.
By contrast, an omitted optional field with Rule::email() returns an error because email('') is invalid.
Use same() on the field you want to compare against another field name.
$validator->setRule('confirm_password', [
Rule::required(),
Rule::same('password'),
]);Keep the referenced field in the submitted payload as well. same() reads the original input array directly, so the smooth path is to send both keys and pair them with required() when the match is mandatory.
exists() and unique() are useful for signup, reset-token, and ownership flows.
$validator->setRule('email', [
Rule::required(),
Rule::unique(User::class, 'email'),
]);These rules resolve the model through the Model package, so they rely on working model and database configuration.