renshipt/laravel-portugal-cities
Installation
composer require laurentino-dev/laravel-portugal-cities dev-master
Update config/app.php to include:
'providers' => [
Laurentinodev\Cities\CitiesServiceProvider::class,
],
'aliases' => [
'Cities' => Laurentinodev\Cities\CitiesFacade::class,
]
Publish & Migrate
php artisan vendor:publish --provider="Laurentinodev\Cities\CitiesServiceProvider"
php artisan cities:migration
php artisan migrate --seed
First Use Case Access districts/concelhos via the facade:
$districts = Cities::districts(); // Collection of all districts
$concelhos = Cities::concelhos(); // Collection of all concelhos
$concelhosInLisbon = Cities::concelhosInDistrict('Lisboa'); // Concelhos in a specific district
Data Retrieval
$allDistricts = Cities::districts();
$lisbonDistrict = Cities::district('Lisboa');
$allConcelhos = Cities::concelhos();
$lisbonConcelhos = Cities::concelhosInDistrict('Lisboa');
$portoConcelho = Cities::concelho('Porto');
Integration with Eloquent
Add a district_id or concelho_id foreign key to your models and use the package for validation/dropdowns:
use Laurentinodev\Cities\CitiesFacade as Cities;
public function rules()
{
return [
'district_id' => 'required|exists:cities,district_id',
'concelho_id' => 'required|exists:cities,concelho_id',
];
}
public function getDistrictOptions()
{
return Cities::districts()->pluck('name', 'district_id');
}
API Responses Return structured data for APIs:
return response()->json([
'districts' => Cities::districts()->toArray(),
'concelhos' => Cities::concelhos()->toArray(),
]);
Blade Templates Use in dropdowns or labels:
<select name="district_id">
@foreach (Cities::districts() as $district)
<option value="{{ $district->district_id }}">
{{ $district->name }}
</option>
@endforeach
</select>
Custom Queries Extend the facade or service container to add custom logic:
// In a service provider or helper
function concelhosByRegion($regionName)
{
return Cities::concelhos()
->where('region', $regionName)
->get();
}
Caching Cache district/concelho data to reduce DB load:
$districts = Cache::remember('portugal_districts', now()->addHours(1), function () {
return Cities::districts();
});
Localization Override names for localization (e.g., English/Portuguese):
// Publish config and extend the seeder
Cities::concelhos()->each(function ($concelho) {
$concelho->english_name = Str::slug($concelho->name);
});
Laravel Version Mismatch
Seeder Timing
CitiesSeeder runs after migrations. Ensure your DatabaseSeeder calls it last to avoid conflicts:
$this->call([
// Other seeders...
'CitiesSeeder',
]);
Table Name Collisions
cities. Rename if conflicts exist (publish config first):
'table' => 'portugal_cities',
Data Updates
composer update laurentino-dev/laravel-portugal-cities
php artisan migrate:fresh --seed
cities table before updates.Missing Data
php artisan db:seed --class=CitiesSeeder
storage/logs/laravel.log.Facade Not Found
config/app.php.php artisan config:clear
Method Not Found
districts(), not Districts()).Performance
district_id, concelho_id) for faster queries:
Schema::table('cities', function (Blueprint $table) {
$table->index('district_id');
$table->index('concelho_id');
});
Testing
$this->app->instance('Cities', Mockery::mock('overload:Cities'));
Extending Functionality
Cities model (extend the seeder):
$concelho->population = $this->generatePopulation(); // Hypothetical
Geospatial Queries
cities table for distance-based searches:
$nearbyConcelhos = Cities::concelhos()
->where('latitude', '>', $lat - 0.5)
->where('latitude', '<', $lat + 0.5)
->get();
How can I help you explore Laravel packages today?