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 Requestpublic 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')],]);
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 Requestpublic function rules(){ return [ 'default_currency' => ['required', new ValidCurrencyCode()], 'accepted_currencies' => ['array'], 'accepted_currencies.*' => [new ValidCurrencyCode()], ];}
Common Valid Currency Codes
USD
- US DollarEUR
- EuroGBP
- British PoundJPY
- Japanese YenCAD
- Canadian DollarAUD
- Australian DollarCHF
- Swiss FrancCNY
- Chinese YuanValidRegion 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 processingpublic 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 validationRoute::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
Caching Validation Results
For high-traffic applications, consider caching validation data:
// In your service provideruse 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(); });}