Installation:
composer require njjeim/world
Publish the config (optional):
php artisan vendor:publish --provider="World\WorldServiceProvider"
First Use Case: Fetch all countries via the facade:
use World\Facades\World;
$countries = World::countries();
Or via API route (/api/countries).
World\Facades\World for direct method calls (e.g., countries(), states(), cities())./api/{endpoint} (e.g., /api/countries, /api/states/{country_id}).config/world.php (if publishing config is needed).// Get all countries
$countries = World::countries();
// Get states for a country (by ISO code)
$states = World::states('US');
// Get cities for a state (by country ISO + state code)
$cities = World::cities('US', 'CA');
GET /api/countries
GET /api/states/US
GET /api/cities/US/CA
Combine facade calls for hierarchical data (e.g., country → states → cities):
$country = World::countries()->where('iso', 'US')->first();
$states = World::states('US');
$cities = World::cities('US', $states[0]->code);
Use the data for dropdowns or validation:
// Example: Country dropdown in a form
$countries = World::countries()->pluck('name', 'iso');
// Validation rule (custom rule or manual check)
$request->validate(['country' => 'required|in:' . implode(',', World::countries()->pluck('iso'))]);
Fetch related data for user profiles or settings:
$timezones = World::timezones(); // For user timezone selection
$currencies = World::currencies(); // For payment systems
$languages = World::languages(); // For localization
Cache responses for performance (e.g., in a service provider):
World::countries()->remember(60 * 24); // Cache for 24 hours
User has a country_id):
public function country()
{
return $this->belongsTo(Country::class, 'country_id')->where('iso', function($query) {
$query->whereIn('iso', World::countries()->pluck('iso'));
});
}
Scout::searchable(Country::class);
// Livewire component
public $countries;
public function mount()
{
$this->countries = World::countries();
}
namespace App\Http\Resources;
use World\Facades\World;
class CountryResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->iso,
'name' => $this->name,
'states' => World::states($this->iso),
];
}
}
type Country {
iso: String!
name: String!
states: [State]
}
World::languages() to populate language selectors:
$languages = World::languages()->pluck('name', 'code');
__('world.countries.'.$country->iso); // If using custom translation files
Data Freshness:
State/City Hierarchy:
if (World::states('US')->isNotEmpty()) {
// Render state dropdown
}
API Route Conflicts:
/api/. If you’re using Laravel’s default API routes (/api), ensure no conflicts:
// In routes/api.php
Route::prefix('v1')->group(function () {
// Your routes
});
routes/web.php or routes/api.php if needed.Case Sensitivity:
US, us) are case-sensitive in some methods. Stick to uppercase:
// Correct:
World::states('US');
// Avoid:
World::states('us');
Memory Usage:
World::countries()) can be memory-intensive for large datasets.$countries = World::countries()->take(100); // Limit results
Missing Data:
config/world.php or vendor/nnjeim/world/src/.dd(World::countries()->toArray());
Facade Not Found:
composer dump-autoload
php artisan config:clear
API Routes Not Working:
api or auth:api) is blocking access. Test with:
php artisan route:list | grep world
Custom Data Sources:
// config/world.php
'data_source' => env('WORLD_DATA_SOURCE', 'default'),
class CustomWorld extends \World\Facades\World
{
public static function countries()
{
return parent::countries()->merge([/* custom countries */]);
}
}
Adding New Endpoints:
WorldServiceProvider to add custom routes or facade methods:
// app/Providers/WorldServiceProvider.php
public function boot()
{
World::extend(function ($app) {
$app->singleton('world.custom', function () {
return new CustomWorld();
});
});
}
Localization Keys:
// resources/lang/en/world.php
{
"countries": {
"US": "United States of America",
"GB": "United Kingdom"
}
}
function localizedCountryName($iso)
{
return __("world.countries.{$iso}", ['default' => World::countries()->where('iso', $iso)->first()->name]);
}
Testing:
World::shouldReceive('countries')->andReturn(collect([/* mock data */]));
World::fake() if the package supports it (check for testing utilities).How can I help you explore Laravel packages today?