Installation:
composer require ijeffro/laravel-airlines dev-master
Add to config/app.php:
'providers' => [
ijeffro\Airlines\AirlinesServiceProvider::class,
],
'aliases' => [
'Airlines' => ijeffro\Airlines\AirlinesFacade::class,
]
Publish Config (Optional):
php artisan vendor:publish --provider="ijeffro\Airlines\AirlinesServiceProvider"
Run Migrations:
php artisan migrate
First Use Case: Fetch an airline by IATA code:
$airline = Airlines::findByIata('AA'); // American Airlines
echo $airline->name; // Output: "American Airlines"
Fetching Airlines:
Airlines::findByIata('DL'); // Delta Air Lines
Airlines::findByName('United'); // Returns United Airlines
Airlines::all(); // Collection of all airlines
Integration with Eloquent:
Add a relationship to an existing model (e.g., Flight):
public function airline()
{
return $this->belongsTo(Airlines::model(), 'airline_iata');
}
Usage:
$flight->airline->name; // "Delta Air Lines"
Validation: Validate IATA codes in forms:
use ijeffro\Airlines\Rules\ValidIataCode;
$request->validate([
'iata_code' => ['required', new ValidIataCode],
]);
API Responses: Return airline data in JSON:
return Airlines::findByIata($request->iata)->toArray();
Custom Queries:
Use the underlying Airlines model directly:
$activeAirlines = Airlines::model()->where('active', 1)->get();
Caching: Cache frequent queries (e.g., all airlines):
$airlines = Cache::remember('all-airlines', now()->addDays(7), function () {
return Airlines::all();
});
Localization: Extend the package to support multi-language names:
// Add a `translations` table and pivot for names in other languages.
Airlines::model()->withTranslations()->get();
Seeding: Seed airlines in a database factory:
$factory->define(Airlines::model(), function (Faker $faker) {
return [
'iata' => $faker->unique()->randomElement(Airlines::all()->pluck('iata')),
'name' => $faker->randomElement(Airlines::all()->pluck('name')),
];
});
Laravel 5 Compatibility: The package is explicitly for Laravel 5. Ensure your project is not using Laravel 6+ without adjustments (e.g., service provider binding changes).
Case Sensitivity: IATA codes are case-sensitive in queries. Always use uppercase:
Airlines::findByIata('aa'); // Returns null (use 'AA' instead)
Database Schema:
The package assumes a default table name (airlines). If you publish the config and change it, ensure migrations reflect this:
Schema::create('custom_airline_table', function (Blueprint $table) {
// ...
});
Duplicate Data: Avoid manually inserting airlines into the database. Use the package’s built-in data or update via:
php artisan airlines:update
Check Data Existence: Verify airlines are loaded:
Airlines::all()->count(); // Should return > 0
Log Queries: Enable Laravel’s query logging to debug issues:
DB::enableQueryLog();
Airlines::findByIata('AA');
dd(DB::getQueryLog());
Facade vs. Model: Prefer the facade for simplicity, but use the model directly for complex queries:
// Facade (simpler)
Airlines::findByIata('AA');
// Model (more control)
Airlines::model()->where('iata', 'AA')->first();
Add Custom Fields:
Extend the airlines table to include custom attributes (e.g., hub_airport):
Schema::table('airlines', function (Blueprint $table) {
$table->string('hub_airport')->nullable();
});
Override Default Data: Replace the default airline data by extending the service provider:
public function register()
{
$this->app->singleton('airlines', function () {
return new CustomAirlinesRepository();
});
}
Add API Endpoints: Create a controller to expose airline data as an API:
Route::get('/api/airlines', function () {
return Airlines::all()->map(function ($airline) {
return [
'iata' => $airline->iata,
'name' => $airline->name,
'active' => $airline->active,
];
});
});
Testing: Mock the facade in tests:
$this->app->instance('Airlines', Mockery::mock('ijeffro\Airlines\AirlinesInterface'));
How can I help you explore Laravel packages today?