Paillasse/portail/app/Console/Commands/SynchroniserCours.php
Adam Belkacemi ca544ac620 ajoute le cache Redis sur les lectures lourdes (bloc B)
Catalogue (labs, banque de quiz officielle, cours) et liste des
classes du tableau de bord prof - jamais d'expiration, invalidation
explicite par les commandes de synchronisation et par
archiver/désarchiver/purge RGPD.

Bug trouvé en vérifiant en réel sur le serveur (pas en local, où
CACHE_STORE=array ne sérialise jamais rien) : mettre en cache des
modèles Eloquent hydratés plante à la relecture via Redis
("incomplete class" à l'unserialize). Corrigé en cachant les attributs
bruts et en reconstruisant de vrais modèles avec Model::hydrate().

Mesuré en réel : 5 appels directs = 5 requêtes SQL, 5 appels via le
cache = 1 requête SQL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 07:34:55 +02:00

48 lines
1.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Cours;
use App\Services\Catalogue\CacheCatalogue;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Symfony\Component\Yaml\Yaml;
/**
* Catalogue des cours.md de paillasse-contenus/ (même esprit que
* labs:synchroniser et quiz:synchroniser-banque) : lu par « Mes cours ».
* Un seul lab (08-deux-lan-routeur) a un cours.md aujourd'hui — les autres
* séquences n'apparaissent simplement pas, jamais de contenu inventé.
*/
class SynchroniserCours extends Command
{
protected $signature = 'cours:synchroniser';
protected $description = 'Crée ou met à jour le catalogue des cours depuis les cours.md de paillasse-contenus/';
public function handle(): void
{
$dossier = config('contenus.dossier');
foreach (File::directories($dossier) as $chemin) {
$identifiant = basename($chemin);
$cheminCours = "{$chemin}/cours.md";
$cheminLab = "{$chemin}/lab.yaml";
if (! File::exists($cheminCours) || ! File::exists($cheminLab)) {
continue;
}
$titre = Yaml::parseFile($cheminLab)['titre'];
$cours = Cours::updateOrCreate(
['identifiant' => $identifiant],
['titre' => $titre, 'contenu_markdown' => File::get($cheminCours)],
);
$this->line(($cours->wasRecentlyCreated ? 'créé' : 'à jour')." : {$identifiant}");
}
CacheCatalogue::viderCours();
}
}