antalaron/vat-number-validator
PHP VAT number validation library built on Symfony Validator. Validate EU VAT formats with easy constraint usage, get violation messages, and optionally plug in custom VAT rules via an extraVat callback. Installable via Composer; MIT licensed.
Validator facade (Symfony-based), requiring minimal architectural changes. The VatNumber constraint integrates seamlessly with Laravel’s validation pipeline, including form requests, API resources, and custom rules.extraVat callback allows for custom validation logic without modifying the core package, aligning with Laravel’s principle of composability. Example use cases include:
phpunit).use Antalaron\Component\VatNumberValidator\VatNumber;
use Illuminate\Support\Facades\Validator;
Validator::extend('vat', function ($attribute, $value, $parameters) {
$validator = \Symfony\Component\Validator\Validation::createValidator();
$violations = $validator->validate($value, new VatNumber());
return empty($violations);
});
StoreCustomerRequest or UpdateSubscriptionRequest.spatie/laravel-data).Illuminate\Validation\Rule for consistency across the codebase.extraVat callbacks require PHP proficiency. Mitigation:
app/Rules/VatNumberRule.php).artisan tinker or a script like:
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$validator->validate('DE123456789', new VatNumber());
}
echo microtime(true) - $start; // Target: <1s for 10K ops
extraVat logic if business rules change?Illuminate\Http\Request subclasses (e.g., StoreCustomerRequest):
public function rules() {
return [
'vat_number' => ['required', 'string', new \App\Rules\VatNumberRule],
];
}
spatie/laravel-api or custom DTOs):
use Antalaron\Component\VatNumberValidator\VatNumber;
use Spatie\LaravelData\Data;
class CustomerData extends Data {
public function rules(): array {
return [
'vat' => ['required', new VatNumber()],
];
}
}
VatNumberRule:
namespace App\Rules;
use Antalaron\Component\VatNumberValidator\VatNumber;
use Illuminate\Contracts\Validation\Rule;
use Symfony\Component\Validator\Validation;
class VatNumberRule implements Rule {
public function passes($attribute, $value) {
$validator = Validation::createValidator();
return empty($validator->validate($value, new VatNumber()));
}
public function message() {
return 'The :attribute is invalid.';
}
}
assertValid() and assertInvalid() in PHPUnit:
public function test_valid_vat() {
$this->assertValid('DE123456789', 'vat_number');
}
public function test_invalid_vat() {
$this->assertInvalid('INVALID', 'vat_number');
}
AppServiceProvider:
Validator::extend('vat', function ($attribute, $value, $parameters, $validator) {
$symfonyValidator = Validation::createValidator();
$violations = $symfonyValidator->validate($value, new VatNumber());
if (!empty($violations)) {
$validator->error($attribute, $violations->get(0)->getMessage());
return false;
}
return true;
});
Phase 1: Validation Proof (1 Day)
composer require antalaron/vat-number-validator.use Antalaron\Component\VatNumberValidator\VatNumber;
use Symfony\Component\Validator\Validation;
$validator = Validation::createValidator();
$violations = $validator->validate($request->vat, new VatNumber());
if (!empty($violations)) {
return response()->json(['error' => $violations->get(0)->getMessage()], 422);
}
DE123456789, FR12345678901).ABC123, DE123).Phase 2: Form/API Integration (2–3 Days)
FormRequest classes (e.g., CustomerRequest).VatNumberRule and document usage.Phase 3: Edge Cases & Extensions (1–2 Days)
extraVat for business rules (e.g., whitelisting).
$validator->validate($vat, new Vat
How can I help you explore Laravel packages today?