日本の大学を取得する必要があったので、こちらのAPIを使用しました
https://api.edu-data.jp/
学校APIのサイトでユーザー登録して、トークンを発行します。
発行したトークをenvファイルに記述します。
.env
UNIVERSITY_API_KEY="発行したトークン"
app/config/services.php
'universities' => [
'key' => env('UNIVERSITY_API_KEY'),
],
Guzzleのラッパーを導入
composer require guzzlehttp/guzzle
大学テーブル作成
php artisan make:model University -m
マイグレーションファイル
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('universities', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('universities');
}
};
モデル
Universtiy.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class University extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
}
大学シーダー作成
php artisan make:seeder UniversitySeeder
学校APIで取得される大学のschool_type_code
はF1
なのでリクエストヘッダ内で指定します。
ヘッダーは、withHeaders
メソッドを使用してリクエストに追加できます。このwithHeadersメソッド
は、キー/値ペアの配列を引数に取ります。
HTTP上のAPI認証方法としてAuthorization
ヘッダーに Bearer
トークンを設定し、Accept
ヘッダーには受け取りたいレスポンスの形式として application/json を指定しています。
UniversitiesSeederファイル
<?php
namespace Database\Seeders;
use App\Models\University;
use GuzzleHttp\Client;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class UniversitiesSeeder extends Seeder
{
/**
* 学校APIから全ての大学を取得し、データベースに保存する
*/
public function run()
{
// APIリクエストのオプションを設定
$response = Http::withHeaders([
//ここでトークン指定
'Authorization' => 'Bearer ' . config('services.universities.key'),
'Accept' => 'application/json',
])->get('https://api.edu-data.jp/api/v1/school?school_type_code=F1');
$data = json_decode($response->getBody()->getContents(), true);
//大学名のみを取得し、データベースに保存
if ($response->getStatusCode() == 200 && isset($data['schools'])) {
$universities = $data['schools']['data'];
foreach ($universities as $university) {
University::create([
'name' => $university['school_name'], // 大学名
]);
}
} else {
// レスポンスが200以外の場合、または$dataが期待する構造でない場合のエラーハンドリング
Log::error('Failed to fetch universities data from API.', ['status' => $response->getStatusCode()]);
return null;
}
}
}
シーダー実行
php artisan db:seed --class=UniversitySeeder
データベースにAPIで取得した大学が入ります。