Validation Rules

Validate country data in your Laravel forms with custom validation rules.

Available Validation Rules

Laravel Countries provides three validation rules for validating country-related data in your forms:

Rule
Purpose
Example
ValidCountryCode Validates country codes (ISO 2 or 3 letter) US, USA, DE, DEU
ValidCurrencyCode Validates currency codes USD, EUR, GBP, JPY
ValidRegion Validates geographical regions Europe, Asia, Americas

ValidCountryCode Rule

Validates country codes in ISO 3166-1 format (2-letter or 3-letter):

use Webpatser\Countries\Rules\ValidCountryCode;
 
// In a Form Request
public function rules()
{
return [
'country' => ['required', new ValidCountryCode()], // Any format
'country_2' => ['required', new ValidCountryCode('iso_3166_2')], // 2-letter only
'country_3' => ['required', new ValidCountryCode('iso_3166_3')], // 3-letter only
];
}
 
// In a Controller
$request->validate([
'shipping_country' => ['required', new ValidCountryCode('iso_3166_2')],
'billing_country' => ['required', new ValidCountryCode('iso_3166_2')],
]);
Try Country Code Validation
Test different country codes to see validation in action:

ValidCurrencyCode Rule

Validates currency codes in ISO 4217 format:

use Webpatser\Countries\Rules\ValidCurrencyCode;
 
// Basic usage
$request->validate([
'currency' => ['required', new ValidCurrencyCode()],
'price_currency' => ['nullable', new ValidCurrencyCode()],
]);
 
// In a Form Request
public function rules()
{
return [
'default_currency' => ['required', new ValidCurrencyCode()],
'accepted_currencies' => ['array'],
'accepted_currencies.*' => [new ValidCurrencyCode()],
];
}

Common Valid Currency Codes

USD - US Dollar
EUR - Euro
GBP - British Pound
JPY - Japanese Yen
CAD - Canadian Dollar
AUD - Australian Dollar
CHF - Swiss Franc
CNY - Chinese Yuan

ValidRegion Rule

Validates geographical region names:

use Webpatser\Countries\Rules\ValidRegion;
 
// Basic usage
$request->validate([
'target_region' => ['required', new ValidRegion()],
'excluded_regions' => ['array'],
'excluded_regions.*' => [new ValidRegion()],
]);
 
// Example form processing
public function updateMarketingSettings(Request $request)
{
$validated = $request->validate([
'primary_market' => ['required', new ValidRegion()],
'secondary_markets' => ['array'],
'secondary_markets.*' => [new ValidRegion()],
]);
 
// Process the validated data...
}

Valid Regions

Africa
Americas
Asia
Europe
Oceania

Complete Form Request Example

Here's a comprehensive example of using all validation rules in a Form Request:

namespace App\Http\Requests;
 
use Illuminate\Foundation\Http\FormRequest;
use Webpatser\Countries\Rules\ValidCountryCode;
use Webpatser\Countries\Rules\ValidCurrencyCode;
use Webpatser\Countries\Rules\ValidRegion;
 
class UserProfileRequest extends FormRequest
{
public function authorize()
{
return true;
}
 
public function rules()
{
return [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'unique:users'],
'country_code' => ['required', new ValidCountryCode('iso_3166_2')],
'preferred_currency' => ['nullable', new ValidCurrencyCode()],
'target_regions' => ['array'],
'target_regions.*' => [new ValidRegion()],
];
}
 
public function messages()
{
return [
'country_code.required' => 'Please select your country.',
'preferred_currency.valid_currency_code' => 'Please enter a valid currency code (e.g., USD, EUR).',
'target_regions.*.valid_region' => 'Please select valid regions only.',
];
}
}

Custom Error Messages

You can customize validation error messages in several ways:

In Form Requests

public function messages()
{
return [
'country_code.valid_country_code' => 'The selected country is invalid.',
'currency.valid_currency_code' => 'Please enter a valid currency code.',
'region.valid_region' => 'The selected region is not supported.',
];
}
 
public function attributes()
{
return [
'country_code' => 'country',
'preferred_currency' => 'currency',
];
}

Using Lang Files

Add custom messages to resources/lang/en/validation.php:

// resources/lang/en/validation.php
'custom' => [
'country_code' => [
'valid_country_code' => 'Please select a valid country from the list.',
],
'billing_currency' => [
'valid_currency_code' => 'The billing currency must be a valid ISO currency code.',
],
],

Advanced Usage

Conditional Validation

public function rules()
{
return [
'country_code' => ['required', new ValidCountryCode('iso_3166_2')],
'state' => [
'required_if:country_code,US',
'string'
],
'currency' => [
Rule::requiredIf($this->input('country_code') !== 'US'),
new ValidCurrencyCode()
],
];
}

Array Validation

// Validate multiple countries
$request->validate([
'supported_countries' => ['required', 'array', 'min:1'],
'supported_countries.*' => [new ValidCountryCode('iso_3166_2')],
'supported_currencies' => ['required', 'array'],
'supported_currencies.*' => [new ValidCurrencyCode()],
]);

API Validation

// API endpoint validation
Route::post('/api/orders', function (Request $request) {
$validated = $request->validate([
'shipping_country' => ['required', new ValidCountryCode('iso_3166_2')],
'billing_country' => ['required', new ValidCountryCode('iso_3166_2')],
'currency' => ['required', new ValidCurrencyCode()],
'target_regions' => ['array'],
'target_regions.*' => [new ValidRegion()],
]);
 
// Process order...
return response()->json(['status' => 'success']);
});

Performance Considerations

Validation Performance
The validation rules are optimized for performance:
  • • Uses database queries with indexed lookups
  • • Minimal memory footprint
  • • Fast validation even with large datasets

Caching Validation Results

For high-traffic applications, consider caching validation data:

// In your service provider
use Illuminate\Support\Facades\Cache;
use Webpatser\Countries\Models\Country;
 
public function boot()
{
// Cache valid country codes for 24 hours
Cache::remember('valid_country_codes', 86400, function () {
return Country::pluck('iso_3166_2')->toArray();
});
}