Aller au contenu

Événements

Ce TP consiste à mettre en place un système de ludification (gamification) pour l'application. L'objectif est d'inciter les utilisateurs à publier du contenu et à mettre en avant les utilisateurs les plus actifs.

1. Page de profil

Afin de pouvoir afficher les différents éléments liés à la ludification, nous allons ajouter une nouvelle page de profil pour l'utilisateur et y afficher les informations que nous possédons déjà le concernant.

Travail à réaliser

  1. Ajouter un champ date d'inscription à l'entité User.
  2. Créer une page de profil utilisateur contenant les informations suivantes :
    • Nom
    • Date d'inscription
  3. Ajouter un champ date de création sur l'entité Quote.
  4. Dans la liste des citations, afficher pour chaque citation la date de création et ajouter un lien vers le profil de l'auteur.
  5. Sur la page de profil, ajouter une liste des 5 dernières citations de l'utilisateur en utilisant une requête Doctrine.

Exemple : https://quote-machine-demo.akollade.fr/profile/2

2. Ludification

Mettre en place un système de ludification en utilisant les événements.

2.1 Expérience

Chaque utilisateur acquiert de l'expérience en fonction des actions qu'il réalise sur le site. Cette expérience permettra ensuite de calculer le niveau de l'utilisateur.

Actions permettant d'acquérir de l'expérience :

  • Ajouter une citation => 100 exp
  • Ajouter une citation dans une catégorie où l'utilisateur n'a jamais posté => 120 exp

Travail à réaliser

  1. Ajouter un champ experience à l'utilisateur
  2. Lancer un événement QuoteCreated à la création d'une citation
  3. Intercepter cet événement via un subscriber ou un listener et ajouter l'expérience à l'utilisateur en fonction des cas de figure
  4. Modifier la factory Foundry des citations pour lancer un événement QuoteCreated après avoir persister une citation

2.2 Niveau

Comment calculer le niveau d'un utilisateur ?

(Exp Level n) = (Exp Level n-1) + (Level n-1) * 100.

  • Level 1 = 0 exp
  • Level 2 = 0 + 1 * 100 = 100 exp
  • Level 3 = 100 + 2 * 100 = 300 exp
  • Level 4 = 300 + 3 * 100 = 600 exp
  • etc
Schéma formule
Monter en niveau réclame de plus en plus d'expérience

Travail à réaliser

  1. Récupérer la classe de test ci-dessous et placez-la dans le répertoire tests\Util de votre projet
  2. En vous appuyant sur la classe de test fournie, développez la classe GamificationEngine correspondant au diagramme de classe ci-dessous :

Diagramme de classe

GamificationEngineTest
<?php

namespace App\Tests\Util;

use App\Entity\User;
use App\Util\GamificationEngine;
use PHPUnit\Framework\TestCase;

class GamificationEngineTest extends TestCase
{
    /**
     * @dataProvider computeLevelForUserProvider
     */
    public function testComputeLevelForUser(int $exp, int $expectedLevel): void
    {
        $user = new User();
        $user->addExperience($exp);

        $this->assertSame($expectedLevel, GamificationEngine::computeLevelForUser($user));
    }

    public function computeLevelForUserProvider(): array
    {
        return [
            [50, 1],
            [100, 2],
            [150, 2],
            [200, 2],
            [420, 3],
            [1500, 6],
        ];
    }

    /**
     * @dataProvider computeExperienceNeededForLevelProvider
     */
    public function testComputeExperienceNeededForLevel(int $level, int $expectedExp): void
    {
        $this->assertSame($expectedExp, GamificationEngine::computeExperienceNeededForLevel($level));
    }

    public function computeExperienceNeededForLevelProvider(): array
    {
        return [
            [1, 0],
            [2, 100],
            [3, 300],
            [4, 600],
        ];
    }

    /**
     * @dataProvider computeLevelCompletionForUserProvider
     */
    public function testComputeLevelCompletionForUser($experience, $levelCompletion): void
    {
        $user = new User();
        $user->addExperience($experience);

        $this->assertSame($levelCompletion, GamificationEngine::computeLevelCompletionForUser($user));
    }

    public function computeLevelCompletionForUserProvider(): array
    {
        return [
            [0, 0],
            [10, 10],
            [60, 60],
            [99, 99],
            [300, 0],
            [360, 20],
            [400, 33],
            [450, 50],
            [540, 80],
        ];
    }
}

Aide

  • computeExperienceNeededForLevel : calcul de l'expérience nécessaire pour atteindre un niveau donné
  • computeLevelForUser : calcul du niveau pour un utilisateur
  • computeLevelCompletionForUser : calcul du pourcentage d'avancement pour monter au niveau suivant. Voir exemple dans Affichage dans le profil.

2.3 Affichage dans le profil

profil utilisateur
Affichage du niveau sur le profil d'un utilisateur

Travail à réaliser

Ajouter les informations suivantes sur la page de profil de l'utilisateur :

  • Le niveau actuel de l'utilisateur
  • Une barre de progression représentant l'avancement pour passer au niveau suivant (voir exemple ci-dessous)

Exemple

Dans la capture d'écran présentée plus haut, l'utilisateur possède un total de 420 points d'expérience.

Pour passer du niveau 3 (300 points d'expérience) au niveau 4 (600 points d'expérience), il devra accumuler 300 points d'expérience.

L'utilisateur ayant déjà gagné 120 points sur les 300 points requis pour passer au niveau suivant, la barre de progression est à 40 % d'avancement.


Ressources :


Dernière mise à jour: February 27, 2023