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 void13 */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 void31 */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 Seeder10{11 /**12 * Run the database seeds.13 *14 * @return void15 */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 migrate2php 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.
A lire
Autres articles de la même catégorie
#3 découverte FilamentPHP : les relations
Troisième article de cette série de tutoriels : intéressons-nous aux relations !
Mathieu De Gracia
Les bases 3/6 : Création des vues
Découverte du moteur de vue Blade
William Suppo
La méthode createOrFirst
Voyons ensemble à quelles problématiques répond la nouvelle méthode createOrFirst !
Mathieu De Gracia