
Création d'un URL Shortener - Gestion des liens
On s’attaque maintenant au coeur de notre application : la gestion des liens de redirection.
Pour cela il nous faut :
- un model lien (et son fichier de migration)
- une route /link/{uid} qui redirigera vers la véritable url.
Le model Link
On commence par créer notre model et son fichier de migration via la commande artisan suivante :
php artisan make:model Link --migration
On modifie notre fichier de migration pour y ajouter quelques colonnes nécessaires :
Schema::create('links', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->string('uid')->unique();
$table->string('url');
$table->timestamps();
$table->foreign('user_id')->on('users')->references('id');
});
Petite particularité, on veut savoir quel utilisateur a généré chaque lien, d’ou la foreign key.
On passe au model pour y ajouter ces nouveaux éléments dans les fillable, ainsi que la définition de notre relation vers le model user :
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'user_id',
'uid',
'url',
];
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user()
{
return $this->belongsTo(User::class);
}
Ce qui va nous permettre de modifier dans notre DatabaseSeeder pour nos tests :
$user = User::create([
'name' => 'Fabrice',
'email' => 'fabrice@laravel.local',
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
]);
Link::create([
'user_id' => $user->id,
'uid' => 'fabpl',
'url' => 'https://fabpl.github.io/',
]);
On lance une commande artisan pour migrer/seeder tout ça (oui je fresh mais c’est pour le tuto hein)
php artisan migrate:fresh --seed
La route
Il nous reste donc la route à écrire. Là encore, pour le tuto, j’utilise une fonction anonyme et non un controller (reprend pas “bêtement” ce code quoi). Dans le fichier routes/web.php :
Route::get('/{uid}', function ($uid) {
$link = \App\Models\Link::whereUid($uid)->firstOrFail();
return response()->redirectTo($link->url);
});
Et voilà ! Tu peux tester /fabpl pour arriver sur mon site perso 😉.
La suite ? Le back office pour lister/créer/modifier/supprimer ces liens.