milwad/laravel-validate
Enhanced Laravel validation with a large set of custom rule classes and helper methods for faster, cleaner advanced validation. Includes localization support and works with Laravel 9+ (PHP 8+), with community-contributed language packs.
Installation:
composer require milwad/laravel-validate
Publish config (optional):
php artisan vendor:publish --tag="laravel-validate-config"
First Use Case: Validate a phone number in a Form Request:
use Milwad\LaravelValidate\Rules\ValidPhoneNumber;
public function rules()
{
return [
'phone' => ['required', new ValidPhoneNumber()],
];
}
Quick Validation: Use built-in rules directly in validation arrays:
$validator = Validator::make($data, [
'email' => 'required|email',
'credit_card' => 'required|ValidCreditCard',
]);
ValidJwt, ValidIban).config/laravel-validate.php) to enable using_container for string-based rule syntax.Rule Instantiation:
$rules = [
'field' => [new ValidEmail(), new ValidDomain()],
];
using_container: true in config):
$rules = [
'field' => 'required|ValidEmail|ValidDomain',
];
Dynamic Rule Parameters:
Pass arguments to rules via with() or constructor:
// Using constructor
new ValidLength(10, 20)
// Using with() (for rules supporting it)
(new ValidLength())->with(10, 20)
Custom Rule Extension:
Extend Milwad\LaravelValidate\Rules\BaseRule for reusable logic:
use Milwad\LaravelValidate\Rules\BaseRule;
class ValidCustomFormat extends BaseRule {
public function passes($attribute, $value) {
return preg_match('/^your_pattern$/', $value);
}
}
Localization: Publish language files for custom messages:
php artisan vendor:publish --tag="validate-lang-en"
Override messages in resources/lang/en/validation.php:
'valid_custom_format' => 'The :attribute must match the custom format.',
Form Request Integration: Combine with Laravel’s Form Requests for DRY validation:
public function rules()
{
return [
'username' => ['required', new ValidDiscordUsername()],
'iban' => ['required', new ValidIban()],
];
}
public function messages()
{
return [
'username.ValidDiscordUsername' => 'Invalid Discord username format.',
];
}
API Validation: Use in API resources or controllers:
public function store(Request $request) {
$validated = $request->validate([
'token' => ['required', new ValidJwt()],
'ip' => ['required', 'ValidIpAddressIPV4'],
]);
}
Testing: Test rules in PHPUnit:
public function test_valid_phone_number()
{
$rule = new ValidPhoneNumber();
$this->assertTrue($rule->passes('phone', '+1234567890'));
$this->assertFalse($rule->passes('phone', 'invalid'));
}
required|ValidCreditCard|digits:16).sometimes or optional with custom rules:
$rules = [
'field' => ['sometimes', new ValidCustomRule()],
];
$validator = Validator::make($data, [
'password' => [
new ValidLength(8),
new ValidContainsSpecialChars(),
],
]);
$this->app->bind('ValidCustomRule', function () {
return new ValidCustomRule();
});
using_container Misconfiguration:
ValidPhone) fail if using_container is false.'using_container' => true in config/laravel-validate.php or use object syntax.config('laravel-validate.using_container') in a Tinker session.Rule Parameter Order:
ValidLength) require parameters in a specific order. Incorrect order may cause silent failures.Localization Overrides:
php artisan view:clear
php artisan config:clear if config changes aren’t applied.Case Sensitivity in Rules:
ValidPhoneNumber vs. validphonenumber).Performance with Complex Rules:
ValidDuplicate or ValidIban may involve heavy computations (e.g., regex, API calls).sometimes to skip when unnecessary.Dependency Conflicts:
ValidJwt) may require additional libraries (e.g., firebase/php-jwt).Testing Edge Cases:
null values). Test with:
$this->assertFalse($rule->passes('field', null));
$this->assertFalse($rule->passes('field', ''));
Enable Debug Mode:
Add this to your AppServiceProvider to log validation errors:
Validator::extend('custom', function ($attribute, $value, $parameters, $validator) {
\Log::debug("Validating $attribute with value: $value");
return true; // or false
});
Inspect Rule Logic:
Temporarily modify the passes() method in custom rules to add debug logs:
public function passes($attribute, $value) {
\Log::debug("Validating $attribute: $value");
return preg_match('/pattern/', $value);
}
Check Published Config:
Verify config/laravel-validate.php after publishing:
php artisan config:clear
Custom Rule Attributes:
Extend Milwad\LaravelValidate\Rules\BaseRule to add custom attributes:
class ValidCustomAttribute extends BaseRule {
public function __construct($attribute) {
$this->attribute = $attribute;
}
public function passes($attribute, $value) {
return $value === $this->attribute;
}
}
Usage:
new ValidCustomAttribute('expected_value')
Dynamic Rule Factories: Create a factory for rules with dynamic parameters:
class RuleFactory {
public static function validLength($min, $max) {
return new ValidLength($min, $max);
}
}
Usage:
$rules = [
'field' => [RuleFactory::validLength(5, 10)],
];
Rule Collections: Group related rules for reuse:
class UserRules {
public static function getRules() {
return [
'email' => ['required', 'email'],
'phone' => [new ValidPhoneNumber()],
];
}
}
Usage:
$validator = Validator::make($data, UserRules::getRules());
Rule Events: Listen to validation events to log or modify rules:
Validator::extend('custom', function () {
event(new Validating());
return true;
});
Rule Testing Utilities: Create a trait for testing rules:
trait TestsRules {
How can I help you explore Laravel packages today?