Utiliser une API pour nourrir une base de manière cohérente

Publié le 11 avril 2022 par William Suppo
Couverture de l'article Utiliser une API pour nourrir une base de manière cohérente

Implémentation d’une alternative à l’utilisation de Faker pour disposer de données cohérentes.

Le contexte

Laravel a injecté dans ses Factory l'outil Faker qui permet la génération de données cohérentes comme du texte, des noms de personnes ou d'entreprises, etc.

Vous pourriez cependant avoir un besoin spécifique comme la génération d'articles pour un site de e-commerce, ou bien disposer des personnages de l'univers Star Wars.

Comment se procurer ces informations ? En cherchant un peu sur le web on trouve des APIs mise à disposition librement comme Fake Store API pour une boutique.

Dans ce tutoriel on va utiliser cette ressource pour nourrir notre base de données, c'est parti !

Définition du modèle

On nomme notre modèle Product qui fait donc référence à un article.

Pour rappel, on dispose d’une commande qui peut générer les classes liées à notre modèle (migration, factory, seeder, etc) comme ceci :

1php artisan make:model --seed --migration Product

Le contenu du modèle n’a rien de particulier :

1<?php
2 
3namespace App\Models;
4 
5use Illuminate\Database\Eloquent\Factories\HasFactory;
6use Illuminate\Database\Eloquent\Model;
7 
8class Product extends Model
9{
10 use HasFactory;
11}

Nous allons définir les champs de notre modèle dans sa migration :

1<?php
2 
3use Illuminate\Database\Migrations\Migration;
4use Illuminate\Database\Schema\Blueprint;
5use Illuminate\Support\Facades\Schema;
6 
7class CreateProductsTable extends Migration
8{
9 /**
10 * Run the migrations.
11 *
12 * @return void
13 */
14 public function up()
15 {
16 Schema::create('products', function (Blueprint $table) {
17 $table->id();
18 $table->timestamps();
19 $table->string('title');
20 $table->float('price');
21 $table->text('description');
22 $table->string('category');
23 $table->string('image');
24 });
25 }
26 
27 /**
28 * Reverse the migrations.
29 *
30 * @return void
31 */
32 public function down()
33 {
34 Schema::dropIfExists('products');
35 }
36}

Enregistrement des données

C’est maintenant que nous allons effectuer l’appel à l’API en utilisant le client HTTP de Laravel et ceci depuis le seeder dédié à notre modèle :

1<?php
2 
3namespace Database\Seeders;
4 
5use App\Models\Product;
6use Illuminate\Database\Seeder;
7use Illuminate\Support\Facades\Http;
8 
9class ProductSeeder extends Seeder
10{
11 /**
12 * Run the database seeds.
13 *
14 * @return void
15 */
16 public function run()
17 {
18 $response = Http::get('https://fakestoreapi.com/products')
19 ->body();
20 
21 $products = json_decode($response);
22 
23 foreach ($products as $product) {
24 Product::create([
25 'title' => $product->title,
26 'price' => $product->price,
27 'description' => $product->description,
28 'category' => $product->category,
29 'image' => $product->image,
30 ]);
31 }
32 }
33}

On peut ensuite jouer notre seeder pour nourrir notre base de données :

1php artisan migrate
2php artisan db:seed --class ProductSeeder

Nous avons dorénavant des données cohérentes dans notre base de données que nous pouvons exploiter lors d’une démo ou tout simplement lors des développements.

À noter qu’il faudrait probablement prévoir le cas où on ne peut pas accéder à l’API et aussi disposer d’une alternative pour les tests car cela pourrait grandement les ralentir.

William Suppo avatar
William Suppo
Je mange du PHP au p'tit dej', et vous ?

A lire

Autres articles de la même catégorie