kazistm/algeria-geo
Laravel package providing Algeria geographic data—provinces (wilayas), districts (daïras), and communes—with seeders/migrations to populate your database. Useful for address forms, location selectors, validation, and geo lookups in Algerian apps.
Installation
composer require kazistm/algeria-geo
Publish the package config (if needed):
php artisan vendor:publish --provider="Kazistm\AlgeriaGeo\AlgeriaGeoServiceProvider"
First Use Case Retrieve all Algerian wilayas (provinces):
use Kazistm\AlgeriaGeo\Facades\AlgeriaGeo;
$wilayas = AlgeriaGeo::wilayas();
// Returns a collection of all wilayas with IDs, names, and codes.
Fetch communes (municipalities) for a specific wilaya:
$wilayaId = 1; // Algiers
$communes = AlgeriaGeo::wilaya($wilayaId)->communes();
Where to Look First
Kazistm\AlgeriaGeo\Facades\AlgeriaGeo (primary entry point).Kazistm\AlgeriaGeo\AlgeriaGeo (for direct instantiation).vendor/kazistm/algeria-geo/src/Data/ for raw JSON/array structures.Data Retrieval
$wilayas = AlgeriaGeo::wilayas()->where('code', '16'); // Get only Tizi Ouzou
$communes = AlgeriaGeo::wilaya('Algiers')->communes();
// or
$communes = AlgeriaGeo::wilaya(1)->communes()->where('name', 'like', '%Dar%');
Integration with Eloquent
Add a wilaya() accessor to a model (e.g., User):
public function getWilayaAttribute()
{
return AlgeriaGeo::wilaya($this->wilaya_id)->name ?? null;
}
Form Validation Validate wilaya/commune inputs:
use Kazistm\AlgeriaGeo\Rules\ValidWilaya;
$request->validate([
'wilaya_id' => ['required', new ValidWilaya],
'commune_id' => ['required', 'exists:communes,id,wilaya_id,'.$request->wilaya_id],
]);
Caching Cache wilayas/communes to reduce DB queries (if storing locally):
$wilayas = Cache::remember('algeria_wilayas', now()->addHours(1), function () {
return AlgeriaGeo::wilayas();
});
<select> options for wilayas/communes:
$options = AlgeriaGeo::wilayas()->pluck('name', 'id')->toArray();
// Example: Find users near a commune's centroid (requires additional setup).
Data Mutability
->first()->name = 'New Name'). Clone if needed:
$wilayaCopy = AlgeriaGeo::wilaya(1)->toArray();
Case Sensitivity
$wilaya = AlgeriaGeo::wilayas()->firstWhere('name', strtolower($request->wilaya));
Missing Data
null values:
$commune = AlgeriaGeo::wilaya(1)->communes()->first();
$latitude = $commune->latitude ?? 0;
Performance
// Bad: Loads all data globally.
AlgeriaGeo::wilayas();
// Good: Load only for specific requests.
if ($request->has('wilaya')) { AlgeriaGeo::wilaya($request->wilaya); }
vendor/kazistm/algeria-geo/src/Data/wilayas.php.function debugAlgeriaGeo($id, $type = 'wilaya')
{
$data = $type === 'wilaya'
? AlgeriaGeo::wilayas()
: AlgeriaGeo::wilaya($id)->communes();
dd($data->pluck('id', 'name'), "ID $id not found in $type data.");
}
$app->bind(Kazistm\AlgeriaGeo\Contracts\GeoDataProvider::class, function () {
return new CustomAlgeriaGeoDataProvider();
});
class ExtendedWilaya extends \Kazistm\AlgeriaGeo\Wilaya
{
public function region()
{
return $this->code >= 27 ? 'East' : 'West';
}
}
Then replace the facade binding in AppServiceProvider.Wilaya/Commune classes:
public function getNameAttribute()
{
return app()->getLocale() === 'ar'
? $this->attributes['name_ar'] ?? $this->attributes['name']
: $this->attributes['name'];
}
name attribute if your app uses a different format.How can I help you explore Laravel packages today?