axlon/laravel-postal-code-validation
Installation:
composer require axlon/laravel-postal-code-validation
config/app.php:
'providers' => [
Axlon\PostalCodeValidation\ValidationServiceProvider::class,
],
First Use Case: Validate a postal code for a specific country in a form request:
// app/Http/Requests/StoreAddressRequest.php
public function rules()
{
return [
'postal_code' => 'required|postal_code:US', // US = ISO 3166-1 alpha-2
];
}
Key Files to Review:
resources/lang/en/validation.php: Customize error messages.app/Providers/AppServiceProvider.php: Override country patterns if needed (see Implementation Patterns).'postal_code' => 'postal_code:NL,DE,FR', // Valid for Netherlands, Germany, or France
'postal_code' => [
PostalCode::for('NL')->or('BE'), // Valid for NL or BE
],
'shipping.postal_code' => [
PostalCode::with('shipping.country')->or('billing.country'),
],
Note: Uses postal_code_with (replaces deprecated postal_code_for).use Axlon\PostalCodeValidation\Facades\PostalCodes;
$isValid = PostalCodes::passes('US', '90210'); // true
'country' => 'required|string|max:2',
'postal_code' => 'required|postal_code_with:country',
'addresses.*.postal_code' => 'postal_code_with:addresses.*.country',
// resources/lang/en/validation.php
'postal_code' => 'The :attribute must be a valid postal code for :countries (e.g., :examples).',
:attribute: Field name (e.g., "Shipping Postal Code").:countries: Comma-separated ISO codes (e.g., "US,CA").:examples: Country-specific examples (e.g., "90210, M5V 3L9").public function rules()
{
return [
'user.address.postal_code' => 'postal_code:GB', // UK-specific
];
}
$validator = Validator::make($request->all(), [
'postal_code' => 'postal_code:JP', // Japan
]);
// Alpine.js
<input x-model="postalCode" x-data="{ error: null }"
@blur="validatePostalCode($event.target.value, 'US')">
// Backend (Livewire)
public function validatePostalCode($postalCode, $country)
{
return PostalCodes::passes($country, $postalCode);
}
// app/Models/User.php
protected static function boot()
{
static::saving(function ($user) {
if ($user->address && !$user->address->isValidPostalCode()) {
throw new \Exception('Invalid postal code for ' . $user->address->country);
}
});
}
use Axlon\PostalCodeValidation\Facades\PostalCodes;
public function testValidPostalCode()
{
$this->assertTrue(PostalCodes::passes('DE', '10115'));
$this->assertFalse(PostalCodes::passes('DE', 'INVALID'));
}
$response = $this->post('/addresses', [
'postal_code' => 'INVALID',
'country' => 'US',
]);
$response->assertSessionHasErrors('postal_code');
Deprecated postal_code_for Rule:
postal_code_with instead (added in v3.1.2). The old rule triggers deprecation warnings.Case Sensitivity:
US, us) are case-insensitive, but regex patterns are not. Override patterns if needed.Empty Input Handling:
null/empty inputs. Add required or nullable explicitly:
'postal_code' => 'nullable|postal_code:CA',
Performance:
postal_code:.implode($countries)). Cache or pre-validate:
$validCountries = ['US', 'CA'];
$rule = 'postal_code:' . implode(',', $validCountries);
Google ADS Dependencies:
Edge Cases:
ES (Spain) or override with IC (ISO 3166-2).PostalCodes::override('NL', '/^[1-9]\d{3}[A-Za-z]{2}$/')).Validate Patterns:
$pattern = PostalCodes::getPattern('US'); // Returns regex for US
Error Messages:
$translator = app('translator');
$message = $translator->get('validation.postal_code', [
'attribute' => 'postal_code',
'countries' => 'US,CA',
'examples' => '90210, M5V 3L9',
]);
Logging:
\Log::debug('Postal code validation', [
'country' => $country,
'code' => $postalCode,
'valid' => PostalCodes::passes($country, $postalCode),
]);
Custom Patterns:
// In a Service Provider
PostalCodes::override([
'XX' => '/^TEST\d{5}$/', // Custom test country
]);
Extending Validation:
use Axlon\PostalCodeValidation\PostalCodeValidator;
class ValidBusinessPostalCode extends \Illuminate\Validation\Rule
{
public function passes($attribute, $value)
{
$country = request()->input('country');
return PostalCodeValidator::passes($country, $value) &&
in_array($country, ['US', 'CA']);
}
}
Usage:
'postal_code' => ['valid_business_postal_code'],
Adding New Countries:
Testing Overrides:
PostalCodes::swap() to temporarily replace patterns in tests:
PostalCodes::swap(function () {
PostalCodes::override('NL', '/^TEST$/');
});
try {
$this->assertTrue(PostalCodes::passes('NL', 'TEST'));
} finally {
PostalCodes::stopSwapping();
}
$addresses = [
['country' => 'US', 'postal_code'
How can I help you explore Laravel packages today?