Bonjour @Hugo ,
J'ai analysé le code de votre plugin RegistrationCode. Dans l'ensemble, le plugin est bien structuré et s'appuie correctement sur les APIs natives de Flatboard (hooks, Plugin::getData, RateLimiter, Ban, Logger, Sanitizer, etc.). Voici quelques points qui mériteraient attention.
1. Couplage fort avec RegisterController
Dans handleRegistrationWithCode(), le contrôleur natif est instancié directement :
$registerController = new \App\Controllers\Auth\RegisterController($request, $response);
$registerController->register();
C'est le point le plus fragile du plugin. Si la signature du constructeur ou la méthode register() évolue dans une future version de Flatboard, le plugin se brisera silencieusement.
Préférable : utiliser le trigger view.user.register.validation déjà prévu dans RegisterController pour y injecter la validation du code, et laisser le routage natif gérer la suite. Cela évite complètement de surcharger la route /register.
2. Surcharge de la route /register par regex
Le plugin enregistre :
$router->regex('POST', '#^/register$#', [$this, 'handleRegistrationWithCode']);
Cela entre en concurrence directe avec la route native de Flatboard. Le comportement dépend de l'ordre de résolution du routeur, ce qui peut provoquer des effets de bord imprévisibles selon la version ou la configuration. En utilisant le hook du point 1, cette surcharge devient inutile.
3. Auto-ban dans la couche plugin
La méthode checkRateLimit() crée directement un ban IP via Ban::create() en cas d'abus. Cette logique existe déjà dans les middlewares natifs (RegisterRateLimitMiddleware). Un second mécanisme de ban dans le plugin risque de créer des doublons ou des incohérences avec la gestion des bans existante.
Suggestion : se limiter à retourner une réponse 429 et laisser les middlewares natifs gérer les bans.
4. Instanciation de new Request() dans addValidationScript()
$request = new Request();
if ($request->getUrl() !== '/register') { return; }
Instancier un objet Request dans un hook de vue est inutile. L'URL courante est accessible directement via $_SERVER['REQUEST_URI'] avec un simple parse_url().
5. Garde-fou class_exists('\App\Core\Logger') superflu
if (class_exists('\App\Core\Logger')) {
\App\Core\Logger::security(...);
}
Logger est une classe du cœur de Flatboard — toujours disponible. Ce contrôle peut être retiré sans risque.
6. Cohérence du nom de vue admin
Flatboard déclenche ce hook dynamiquement sous la forme plugin.view.{viewName}.vars. Le plugin s'abonne à plugin.view.admin.vars, ce qui suppose que le fichier de vue est nommé admin.php. Ce point n'est pas documenté dans le README.md — une mention faciliterait la maintenance.
7. Structure de plugin.json non conventionnelle
Plusieurs champs sont présents mais ignorés par Flatboard :
main — non utilisé, c'est class qui est lucategory, homepage, repository — non lus nulle part dans le corei18n — ignoré, Flatboard charge les traductions directement depuis langs/{lang}.jsoncompatibility — non vérifié par le coresettings — doublon de plugin, seul ce dernier est lu par Plugin::getData()
La structure conventionnelle attendue est : name, id, description, author, email, website, version, date, license, active, priority, class, requires, hooks, permissions, plugin.
8. Partage dans le centre de ressources
Comme mentionné pour le plugin Poll, il serait apprécié que ce plugin soit partagé dans le centre de ressources de Flatboard afin que la communauté puisse en bénéficier, le tester et y contribuer.
Ces remarques visent à rendre le plugin plus robuste face aux évolutions futures de Flatboard. Le travail réalisé est solide dans l'ensemble, notamment sur la sanitisation des entrées, la gestion des traductions et l'utilisation des assets via PluginAssetHelper.
N'hésitez pas si vous avez des questions.
Cordialement Fred.
Edit:
[1.2.0] - 2026-04-05
Ajouté
- Traduction allemande (
de.json) - Traduction portugaise (
pt.json) - Traduction chinoise (
zh.json)
Modifié
- Couverture linguistique complète : toutes les langues natives de Flatboard sont désormais supportées (de, en, fr, pt, zh)
- Version portée à
1.2.0
[1.1.0] - 2026-04-05
Corrigé
- Suppression de la surcharge de la route
POST /register par regex — le plugin n'entre plus en concurrence avec le routeur natif de Flatboard - Suppression de l'instanciation directe de
RegisterController qui créait un couplage fort avec le cœur du framework - Remplacement de
new Request() dans addValidationScript() par une lecture directe de $_SERVER['REQUEST_URI'] via parse_url() - Suppression du
Ban::create() automatique dans checkRateLimit() — la gestion des bans est désormais entièrement déléguée aux middlewares natifs de Flatboard - Suppression du garde-fou
class_exists('\\App\\Core\\Logger') — Logger est une classe du cœur toujours disponible
Ajouté
- Hook natif
view.user.register.validation pour injecter la validation du code dans le flow d'inscription sans surcharger aucune route - Déclaration du hook
view.user.register.validation dans plugin.json
Modifié
plugin.json réorganisé selon la convention native de Flatboard (ordre des champs aligné sur les plugins du cœur EasyMDE et Logger)- Champs non lus par Flatboard supprimés :
main, category, homepage, repository, i18n, compatibility, settings - Champs conventionnels ajoutés :
email, website, date, priority requires.flatboard remplace l'ancien champ compatibility.min_version et passe à >=5.4.0- Version portée à
1.1.0
registrationcode-20260405135615.zip