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
Inversion de dépendance en Laravel
Améliorons l'architecture de nos projets en implémentant une dépendance externe à travers 3 approches différentes.
Le driver email failover
Protégez-vous des indisponibilités de votre serveur e-mails grace à un driver failover !
Les failles RCE dans Laravel
Une faille RCE consiste à injecter puis exécuter arbitrairement du code dans une application, voyons comment exploiter l’une d’entre elles dans un Laravel 9 !