Install the package via Composer:
composer require ajgl/validator-es
First Use Case: Validate a Spanish DNI in a Laravel form request.
Create a custom validation rule:
// app/Rules/SpanishDniRule.php
namespace App\Rules;
use Ajgl\ValidatorEs\DniValidator;
use Illuminate\Contracts\Validation\Rule;
class SpanishDniRule implements Rule
{
public function passes($attribute, $value)
{
$validator = new DniValidator();
return $validator->isValid($value);
}
public function message()
{
return 'The :attribute must be a valid Spanish DNI.';
}
}
Use the rule in a FormRequest:
// app/Http/Requests/StoreUserRequest.php
public function rules()
{
return [
'dni' => ['required', new \App\Rules\SpanishDniRule],
];
}
Test with valid/invalid inputs:
$this->post('/users', [
'dni' => '12345678A', // Valid
])->assertValid();
$this->post('/users', [
'dni' => '12345678B', // Invalid
])->assertInvalid(['dni' => 'The dni must be a valid Spanish DNI.']);
Key Files to Reference:
vendor/ajgl/validator-es/src/ for validator classes.tests/ (if added in future versions) for edge cases.Wrap each validator in a Laravel Rule for seamless integration with FormRequest and API validation.
Example for NIE:
// app/Rules/SpanishNieRule.php
namespace App\Rules;
use Ajgl\ValidatorEs\NieValidator;
use Illuminate\Contracts\Validation\Rule;
class SpanishNieRule implements Rule
{
public function passes($attribute, $value)
{
$validator = new NieValidator();
return $validator->isValid($value);
}
public function message()
{
return 'The :attribute must be a valid Spanish NIE.';
}
}
Usage:
// In FormRequest or Controller
'nie' => ['required', new \App\Rules\SpanishNieRule],
Centralize validation logic in a service for reusable business rules (e.g., user onboarding, payment processing).
Example:
// app/Services/SpanishIdValidatorService.php
namespace App\Services;
use Ajgl\ValidatorEs\ValidatorInterface;
class SpanishIdValidatorService
{
public function validateIdCard(string $idCard): bool
{
$validator = new \Ajgl\ValidatorEs\IdCardValidator();
return $validator->isValid($idCard);
}
public function validateSpanishIban(string $iban): bool
{
$validator = new \Ajgl\ValidatorEs\IbanValidator();
return $validator->isValid($iban);
}
}
Usage in Controller:
public function store(Request $request)
{
$validator = app(SpanishIdValidatorService::class);
if (!$validator->validateIdCard($request->dni)) {
return back()->withErrors(['dni' => 'Invalid ID card.']);
}
// Proceed with logic...
}
Use the validators in API responses to ensure data integrity before processing.
Example:
// app/Http/Controllers/UserController.php
public function store(Request $request)
{
$request->validate([
'dni' => ['required', new \App\Rules\SpanishDniRule],
'iban' => ['required', new \App\Rules\SpanishIbanRule],
]);
// Process validated data...
}
Example (Laravel Livewire):
// app/Http/Livewire/UserRegistration.php
protected $rules = [
'dni' => ['required', new \App\Rules\SpanishDniRule],
];
public function updatedDni()
{
$this->validateOnly('dni');
}
Example (Laravel Sanctum):
// app/Http/Middleware/ValidateSpanishIds.php
public function handle(Request $request, Closure $next)
{
if ($request->has('user.dni')) {
$validator = new \Ajgl\ValidatorEs\DniValidator();
if (!$validator->isValid($request->user['dni'])) {
return response()->json(['error' => 'Invalid DNI'], 422);
}
}
return $next($request);
}
Example (Observer):
// app/Observers/UserObserver.php
public function creating(User $user)
{
$validator = new \Ajgl\ValidatorEs\DniValidator();
if (!$validator->isValid($user->dni)) {
throw new \InvalidArgumentException('Invalid DNI format.');
}
}
Test the wrapper rules to ensure they delegate correctly to the underlying validators.
Example:
// tests/Unit/Rules/SpanishDniRuleTest.php
public function test_dni_validation()
{
$rule = new \App\Rules\SpanishDniRule();
$this->assertTrue($rule->passes('dni', '12345678A'));
$this->assertFalse($rule->passes('dni', '12345678B'));
}
Test validation in the context of user flows (e.g., registration, profile updates).
Example (Registration Flow):
// tests/Feature/UserRegistrationTest.php
public function test_dni_validation_on_registration()
{
$response = $this->post('/register', [
'dni' => '12345678B', // Invalid
'name' => 'Test User',
]);
$response->assertSessionHasErrors('dni');
}
Test edge cases like:
null, integers).Example:
public function test_edge_cases()
{
$validator = new \Ajgl\ValidatorEs\DniValidator();
$this->assertFalse($validator->isValid(''));
$this->assertFalse($validator->isValid(null));
$this->assertFalse($validator->isValid(12345678)); // Non-string
}
Case Sensitivity in NIE/DNI:
71234567Z, not 71234567z).$dni = strtoupper($request->dni);
IBAN Limitations:
IbanValidator only supports Spanish IBANs (e.g., ESXXXXXX).if (!str_starts_with($iban, 'ES')) {
return false;
}
CCC Validation Quirks:
CccValidator may reject valid CCC codes if they include non-numeric characters (e.g., spaces, hyphens).$ccc = preg_replace('/[^0-9]/', '', $request->ccc);
No Real-Time Verification:
Deprecated Methods:
Symfony\Component\Validator\Validator).ajgl/validator-es:^0.1.6).No Custom Error Messages:
true/false without context.public
How can I help you explore Laravel packages today?