sokil/php-isocodes-db-only
Database-only package for sokil/php-isocodes: ISO 3166-1 countries, 3166-2 subdivisions, 639-3 languages, 4217 currencies, and 15924 scripts. No i18n/localized names. Updated monthly (2nd day).
Install the Package:
composer require sokil/php-isocodes sokil/php-isocodes-db-only
First Use Case: Fetch a Country
use Sokil\IsoCodes\IsoCodes;
// Get country by ISO alpha-2 code
$country = IsoCodes::getCountry('US');
echo $country->name; // "United States"
echo $country->alpha2; // "US"
echo $country->alpha3; // "USA"
// Get subdivisions (e.g., US states)
$subdivisions = IsoCodes::getSubdivisions('US');
foreach ($subdivisions as $subdivision) {
echo $subdivision->name; // "California", "Texas", etc.
}
Where to Look First:
IsoCodes is the primary entry point for all ISO code lookups.Country, Subdivision, Language, Currency, and Script classes provide structured data access.Database Integration (Optional): If you need to persist ISO data in your Laravel database:
resources/sql/ (if available) or use the library’s built-in data.php artisan make:migration import_iso_codes --table=countries
Basic Lookups:
// Countries
$country = IsoCodes::getCountry('GB'); // United Kingdom
$countryName = $country->name;
// Subdivisions (e.g., UK regions)
$subdivisions = IsoCodes::getSubdivisions('GB');
$firstSubdivision = $subdivisions[0]->name; // "England"
// Languages
$language = IsoCodes::getLanguage('eng'); // English
$languageName = $language->name;
// Currencies
$currency = IsoCodes::getCurrency('USD'); // US Dollar
$currencySymbol = $currency->symbol; // "$"
Validation in Laravel Forms:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'country_code' => [
'required',
function ($attribute, $value, $fail) {
if (!IsoCodes::hasCountry($value)) {
$fail('The '.$attribute.' must be a valid ISO country code.');
}
},
],
'language_code' => [
'required',
function ($attribute, $value, $fail) {
if (!IsoCodes::hasLanguage($value)) {
$fail('The '.$attribute.' must be a valid ISO language code.');
}
},
],
]);
Dynamic Dropdowns in Blade:
<select name="country">
@foreach(IsoCodes::getCountries() as $country)
<option value="{{ $country->alpha2 }}">
{{ $country->name }}
</option>
@endforeach
</select>
Caching for Performance:
use Illuminate\Support\Facades\Cache;
$countries = Cache::remember('iso.countries.all', now()->addDays(30), function () {
return IsoCodes::getCountries();
});
Integration with Eloquent: Create a trait or service to extend Eloquent models:
use Sokil\IsoCodes\IsoCodes;
trait HasIsoCountry
{
public function getCountryAttribute($value)
{
return IsoCodes::getCountry($value);
}
}
// Usage in a model:
class User extends Model
{
use HasIsoCountry;
}
// Query:
$user = User::whereHas('country', function ($query) {
$query->where('alpha2', 'US');
})->first();
User Registration with Country Selection:
country_code column) and fetch the full object when needed.Multi-Currency Support:
$currency = IsoCodes::getCurrency($request->currency);
if (!$currency) {
abort(422, 'Invalid currency code.');
}
Localization and Routing:
$language = IsoCodes::getLanguage($request->lang);
return redirect()->route('home', ['lang' => $language->alpha3]);
Data Migration:
use Sokil\IsoCodes\IsoCodes;
use Illuminate\Database\Seeder;
class ImportIsoCodes extends Seeder
{
public function run()
{
DB::table('countries')->insert(
array_map(function ($country) {
return [
'iso_alpha2' => $country->alpha2,
'iso_alpha3' => $country->alpha3,
'name' => $country->name,
// ... other fields
];
}, IsoCodes::getCountries())
);
}
}
Laravel Service Providers:
Bind the IsoCodes facade for easier dependency injection:
// In AppServiceProvider
public function register()
{
$this->app->bind('isoCodes', function () {
return new \Sokil\IsoCodes\IsoCodes();
});
}
API Responses: Return ISO data in API responses for consistency:
return response()->json([
'country' => [
'code' => $country->alpha2,
'name' => $country->name,
'currency' => $country->currency->alpha3,
],
]);
Testing:
Mock the IsoCodes facade in tests to avoid hitting the database:
$this->mock(\Sokil\IsoCodes\IsoCodes::class, function ($mock) {
$mock->shouldReceive('getCountry')
->with('US')
->andReturn((object) ['name' => 'United States', 'alpha2' => 'US']);
});
Custom Data Sources: If you need to extend the ISO data, subclass the core library:
use Sokil\IsoCodes\IsoCodes as BaseIsoCodes;
class CustomIsoCodes extends BaseIsoCodes
{
public function getCustomCountries()
{
$countries = parent::getCountries();
// Add custom logic or data
return $countries;
}
}
Case Sensitivity:
US, GB) are case-sensitive in some implementations. Always use uppercase:
$country = IsoCodes::getCountry('us'); // May return null
$country = IsoCodes::getCountry('US'); // Correct
Missing Subdivisions:
ISO 3166-2 may not exist for some nations). Handle missing data gracefully:
$subdivisions = IsoCodes::getSubdivisions('US') ?: collect();
Database Schema Mismatches:
iso_alpha2 should be CHAR(2) or VARCHAR(2) (not longer).name fields may contain non-ASCII characters (use UTF-8 collation).Monthly Updates:
composer update sokil/php-isocodes-db-only
php artisan migrate:fresh --seed # If using migrations/seeds
No Translations:
sokil/php-isocodes-db-i18n or implement a translation layer.Performance with Large Datasets:
Cache::remember("subdivisions.{$countryCode}", now()->addHours(1), function () use ($countryCode)
How can I help you explore Laravel packages today?