World is a powerful PHP and Laravel package for retrieving structured geographical data, including continents, countries, provinces, and cities. This package is lightweight, optimized for performance, and seamlessly integrates with Laravel applications.
โ Get all continents, countries, provinces, and cities
โ Filter countries by continent
โ Retrieve provinces and cities for any country
โ Optimized for high performance with caching
โ Compatible with Laravel and PHP
โ Includes migrations and seeding for easy setup
โ includes a Laravel Facade for simpler usage!
Install via Composer:
composer require thecoder/world
If auto-discovery is not working, manually add the service provider in config/app.php
:
TheCoder\World\WorldServiceProvider::class,
php artisan vendor:publish --provider="TheCoder\World\WorldServiceProvider"
This will publish:
โ
config/world.php
(configuration file)
โ
Database migration files
php artisan migrate
php artisan world:seed
This will populate the database with continents, countries, provinces, and cities.
The package now includes a World Facade, making it easier to access data:
use World;
$continents = World::continents()->get(); // Get all continents
$countries = World::countries()->get(); // Get all countries
use TheCoder\World;
$world = new World();
$continents = $world->continents()->get();
$countries = $world->countries()->get();
$asia = World::continents('Asia')->first();
$asia = World::continents()->englishNameEqual('Asia')->first();
$asiaCountries = World::continents()->englishNameEqual('Asia')->countries()->get();
$iranProvinces = World::countries('Iran')->provinces()->get();
$iranProvinces = World::countries()->englishNameEqual('Iran')->provinces()->get();
$gilanCities = World::provinces('Gilan')->cities()->get();
$gilanCities = World::provinces()->englishNameEqual('Gilan')->cities()->get();
Since the World database is static and never changes, this package supports permanent caching to eliminate redundant database queries and significantly improve performance.
You can enable caching in the config/world.php
file:
'cache' => [
'enabled' => true,
'prefix' => 'thecoder-world-',
'tag' => 'thecoder-world',
'ttl' => null, // Store cache forever
],
Setting ttl to null ensures that data is cached forever.
If caching is enabled, queries will automatically store results in the cache forever.
To clear the cache manually, run:
php artisan cache:clear
Or in code:
World::clearCache();
The package now provides a World Facade out-of-the-box, meaning Laravel users don't need to set it up manually.
โ No need to register aliases
โ Works automatically in Laravel
Just install the package and start using it:
use World;
$continents = World::continents()->get();
Ensure you have the necessary dependencies installed:
composer install --dev
Due to special columns in the database, SQLite is not supported for testing.
Instead, configure MySQL in phpunit.xml:
<php>
<env name="DB_CONNECTION" value="mysql"/>
<env name="DB_HOST" value="127.0.0.1"/>
<env name="DB_PORT" value="3306"/>
<env name="DB_DATABASE" value="world_test_database"/>
<env name="DB_USERNAME" value="root"/>
<env name="DB_PASSWORD" value=""/>
</php>
vendor/bin/phpunit
This package provides a locations table designed to store structured geographic data with hierarchical relationships.
Column | Type | Description |
---|---|---|
id |
Integer (PK) | Unique identifier |
continent_id |
Integer (FK) | Parent continent (nullable) |
country_id |
Integer (FK) | Parent country (nullable) |
province_id |
Integer (FK) | Parent province (nullable) |
iso_code |
String (3) | ISO country code (e.g., "US") |
type |
Enum | continent , country , province , city |
english_name |
String | Location name in English |
native_name |
String | Local name (optional) |
timezone |
String | Time zone (e.g., "Asia/Tehran") |
is_capital |
Boolean | Marks capital cities (default: false) |
priority |
Integer | Sort priority (default: 0) |
center |
POINT | Geographic coordinates |
area |
MULTIPOLYGON | Spatial data for regions |
โ
Indexed for fast queries
โ
Supports geographic coordinates & boundaries
It helps developers retrieve geographical data (continents, countries, provinces, and cities) for Laravel & PHP applications.
Yes! It fully supports Laravel and can also be used in vanilla PHP projects.
World::continents('Europe')->countries()->get();
World::provinces('California')->cities()->get();
๐น GitHub Repository: thecoder/world
๐น Issues & Features: Submit Here
๐น Contribute: Fork, star โญ, and submit PRs
๐ก Need more features? Open an issue or contribute to the project!