É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
- Ajouter un champ date d'inscription à l'entité
User
. - Créer une page de profil utilisateur contenant les informations suivantes :
- Nom
- Date d'inscription
- Ajouter un champ date de création sur l'entité
Quote
. - Dans la liste des citations, afficher pour chaque citation la date de création et ajouter un lien vers le profil de l'auteur.
- 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
- Ajouter un champ
experience
à l'utilisateur - Lancer un événement
QuoteCreated
à la création d'une citation - Intercepter cet événement via un subscriber ou un listener et ajouter l'expérience à l'utilisateur en fonction des cas de figure
- 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

Travail à réaliser
- Récupérer la classe de test ci-dessous et placez-la dans le répertoire
tests\Util
de votre projet - En vous appuyant sur la classe de test fournie, développez la classe
GamificationEngine
correspondant au diagramme de classe ci-dessous :
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 utilisateurcomputeLevelCompletionForUser
: calcul du pourcentage d'avancement pour monter au niveau suivant. Voir exemple dans Affichage dans le profil.
2.3 Affichage dans le profil¶

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 :