Fabrice Planchette

Création d'un URL Shortener - Gestion des liens

Sep 24, 2020

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.

Liens