axlon/laravel-postal-code-validation
Install via Composer:
composer require axlon/laravel-postal-code-validation
First use case: Validate a postal code for a specific country in a form request.
use Illuminate\Validation\Rule;
$request->validate([
'postal_code' => ['required', Rule::postal_code('US')],
]);
Where to look first:
postal_code vs. postal_code_with.Pattern: Use postal_code rule with ISO country codes (e.g., US, DE).
$request->validate([
'country' => 'required|string|size:2',
'postal_code' => 'required|postal_code:'.$request->country,
]);
Fluent API Alternative (for dynamic countries):
use Axlon\PostalCodeValidation\Rules\PostalCode;
$request->validate([
'postal_code' => [new PostalCode($request->country)],
]);
Pattern: Use postal_code_with when country is dynamic or optional.
$request->validate([
'billing_country' => 'required|string|size:2',
'shipping_country' => 'nullable|string|size:2',
'shipping_postal_code' => 'postal_code_with:billing_country,shipping_country',
]);
Fluent API:
'shipping_postal_code' => [
new PostalCode->with('billing_country')->or('shipping_country'),
],
Pattern: Use the PostalCodes facade for standalone checks.
use Axlon\PostalCodeValidation\Facades\PostalCodes;
if (PostalCodes::passes('US', '90210')) {
// Valid
}
Use case: Validate addresses in cron jobs, API responses, or non-form contexts.
Pattern: Customize regex for specific countries (e.g., legacy formats).
// In a service provider or config file
PostalCodes::override('US', '/^\d{5}(-\d{4})?$/'); // ZIP+4 support
Use case: Override patterns for internal systems (e.g., company-specific codes).
Pattern: Extend validation messages in resources/lang/{locale}/validation.php.
'postal_code' => 'The :attribute must be a valid postal code for :countries (e.g., :examples).',
Placeholder examples:
:countries → US, CA:examples → 90210, K1A 0B1Pattern: Mock the facade for unit tests.
PostalCodes::shouldReceive('passes')
->once()
->with('US', '90210')
->andReturn(true);
Use case: Isolate validation logic from external dependencies.
Case Sensitivity:
US = us), but ensure consistency in your codebase.Missing Arguments:
postal_code:US).'postal_code' => 'postal_code:'.$request->country ?? 'US',
Dynamic Arrays:
addresses.*.postal_code), use dot notation:
'addresses.*.postal_code' => 'postal_code_with:addresses.*.country',
Deprecated postal_code_for:
postal_code_with instead (same functionality, no deprecation warnings).Performance:
Validate Manually:
Use PostalCodes::passes() to debug specific cases:
dd(PostalCodes::passes('NL', '1234AB')); // true/false
Check Patterns: Inspect the underlying regex for a country:
dd(PostalCodes::pattern('US')); // e.g., '/^\d{5}(-\d{4})?$/'
Error Messages:
If placeholders (:countries, :examples) are empty, ensure the rule received valid arguments.
Lumen Users:
Explicitly register the provider in bootstrap/app.php if using Lumen.
Custom Rules:
Extend the PostalCode class to add logic (e.g., validate against a database):
use Axlon\PostalCodeValidation\Rules\PostalCode as BasePostalCode;
class CustomPostalCode extends BasePostalCode {
public function passes($attribute, $value) {
return parent::passes($attribute, $value) &&
DB::table('valid_codes')->where('code', $value)->exists();
}
}
Add Countries: Contribute missing patterns via GitHub Issues.
Batch Validation: For bulk validation (e.g., CSV imports), use the facade in a loop:
foreach ($addresses as $address) {
if (!PostalCodes::passes($address['country'], $address['postal_code'])) {
$errors[] = "Invalid code: {$address['postal_code']}";
}
}
Service Provider:
If using Laravel <8.0, manually register the provider in config/app.php:
'providers' => [
Axlon\PostalCodeValidation\ValidationServiceProvider::class,
],
Facade Alias:
The PostalCodes facade is auto-discovered. No additional config needed.
PHP 8+:
Uses named arguments in some methods (e.g., PostalCode::for()). Ensure your IDE supports PHP 8 syntax hints.
Combine with Other Rules: Add length checks or alphanumeric constraints:
'postal_code' => 'postal_code:US|min:5|max:10',
API Responses: Return formatted errors with examples:
return response()->json([
'error' => 'Invalid postal code for US (e.g., 90210).',
], 422);
Frontend Integration: Use the package’s examples in JavaScript for real-time validation:
// Show examples like "1234 AB" for NL in your form hints.
Logging: Log invalid codes for analytics:
if (!PostalCodes::passes($country, $code)) {
Log::warning("Invalid postal code: {$code} for {$country}");
}
How can I help you explore Laravel packages today?