becklyn/vatin-bundle
Symfony bundle integrating the VATIN library to validate EU VAT numbers. Provides a @Vatin constraint for format checks and optional VIES existence validation, plus services to validate VATINs and query the VIES SOAP web service directly.
The becklyn/vatin-bundle is a Symfony bundle leveraging the ddeboer/vatin library, which provides VAT validation (format and VIES-based existence checks). While Laravel is PHP-based, this bundle is not natively Laravel-compatible—it requires Symfony’s dependency injection (DI) container and validation system. However, Laravel’s Symfony bridge (e.g., symfony/validator, symfony/http-client) allows integration via:
Validator facade (for format checks).Key Fit Gaps:
ContainerInterface with Laravel’s Container).@Vatin constraint can be adapted to Laravel’s validation system (e.g., VatinValidator class).ViesService).HttpClient or Guzzle).$validator = app()->make('ddeboer_vatin.vatin_validator')) is possible but clunky without DI adaptation.| Risk Area | Severity | Mitigation |
|---|---|---|
| Symfony DI dependency | High | Abstract Symfony services into Laravel-compatible interfaces. |
| VIES unreliability | High | Implement exponential backoff + caching. |
| Testing conflicts | Medium | Isolate Becklyn tests in a separate suite. |
| Forked repo maintenance | Medium | Monitor upstream ddeboer/vatin for critical fixes. |
Symfony Abstraction:
Illuminate\Contracts\Container\Container without breaking functionality?VIES Integration:
Testing:
actingAs)?Performance:
Maintenance:
ddeboer/vatin?Critical Dependencies:
| Dependency | Laravel Equivalent | Notes |
|---|---|---|
symfony/validator |
symfony/validator (via Laravel) |
Use Laravel’s Validator facade. |
symfony/http-client |
illuminate/http-client or Guzzle |
Replace for VIES calls. |
symfony/dependency-injection |
Laravel’s DI | Requires custom service binding. |
Phase 1: Format Validation Only
@Vatin with a Laravel custom validator:
use Ddeboer\Vatin\Validator\VatNumberValidator;
use Illuminate\Validation\Validator as LaravelValidator;
class VatinValidator extends \Illuminate\Validation\Validator {
public function validateVatin($attribute, $value, $parameters) {
$validator = new VatNumberValidator();
return $validator->isValid($value);
}
}
AppServiceProvider:
Validator::extend('vatin', 'App\Validation\VatinValidator@validateVatin');
Phase 2: VIES Integration
class ViesService {
public function checkVat(string $countryCode, string $vatNumber): bool {
$client = new \Ddeboer\Vatin\Vies\Client();
$response = $client->checkVat($countryCode, $vatNumber);
// Cache response (e.g., Redis) and handle errors.
return $response->isValid();
}
}
$this->app->singleton(ViesService::class, function ($app) {
return new ViesService();
});
Phase 3: Testing Infrastructure
tests/Becklyn directory.ddeboer/vatin. Pin versions strictly.ddeboer/vatin’s robust rules.ddeboer/vatin.ViesService) in the codebase.memory_get_usage().| Scenario | Impact | Mitigation |
|---|---|---|
| VIES service downtime | Validation failures | Fallback to format-only checks. |
| Cache stampede | High Redis load | Use probabilistic early expiration. |
| Symfony DI conflicts | Service registration failures | Abstract all Symfony dependencies. |
| Becklyn test flakiness | CI pipeline failures | Isolate tests; add retries. |
| **Forked |
How can I help you explore Laravel packages today?