Guida Contributori
Ultimo aggiornamento: 2026-04-24
Scopo
Guida unica per contribuire a Logeon senza regressioni su /game, /admin e core runtime.
Lettura consigliata (ordine)
README.mdCONTRIBUTING.mddocs/README.mddocs/guida-architettura-frontend.mddocs/guida-runtime-db-schema.mddocs/contratti-api-backend.md
Setup locale minimo
composer install- Configura
configs/config.php,configs/db.php,configs/app.php - Inizializza DB da installer (
/install) o import dello schema unico - Verifica ambiente:
C:\xampp\php\php.exe scripts/php/smoke-core-runtime.php
Regole obbligatorie
- Niente JS inline nei template Twig.
- Niente CSS inline nei template Twig.
- Permessi sempre server-side con
Core\AuthGuard. - Nuovi endpoint JSON con
Core\Http\RequestData+Core\Http\ResponseEmitter. - Non introdurre nuovi pattern legacy (
echo json_encode(...),die(...), parsing diretto$_POST['data']). - Se una logica e modulo-specifica, non metterla nel core.
- Le view pubbliche che includono la modale login devono ricevere dal backend il contesto
google_auth(almenogoogle_auth.enabled). - Le interfacce di dominio vanno in
app/Contracts/, non mescolate con i file di service. - Il core non deve importare o richiamare direttamente codice di moduli opzionali: usare
CustomEventneutrali o hook (Core\Hooks). - I nuovi file JS devono usare ESM (
import/export), non IIFE ne assegnamentiwindow.*. - I moduli hanno due classi: Classe A (bundled, solo activate/deactivate) e Classe B (optional, ciclo completo). I nuovi moduli sono sempre Classe B. Vedi
docs/guida-sistema-moduli.md— sezione Tassonomia moduli.
File ad alto rischio (toccare solo con task mirato)
core/Models.phpcore/Router.phpcore/SessionGuard.phpcore/Template.phpcore/Database/MysqliDbAdapter.phpcore/Database/DbAdapterFactory.phpapp/services/AuthService.phpautoload.phpapp/routes.php
Workflow standard per una feature
- Definisci comportamento + permessi.
- Implementa service backend.
- Implementa controller + route.
- Aggiorna UI Twig con hook
data-*. - Implementa logica frontend in
assets/js/app/features/oassets/js/app/modules/. - Se e una nuova pagina admin, registrala in tutti e tre i punti:
MODULE_FACTORY_MAPinadmin.registry.jsgetPageModules()inadmin.registry.js(fonte autoritativa — non ometterlo)modulesmap inadmin.runtime.js
- Aggiorna docs coinvolte.
Workflow Git e Pull Request (sintesi)
- Crea branch breve da
mainaggiornato. - Apri PR in
Draftappena il perimetro e chiaro. - Porta la PR a
Ready for reviewsolo dopo i check minimi. - Risolvi commenti review con commit dedicati.
- Merge preferito:
Squash and merge.
Convenzioni rapide:
- Branch:
<tipo>/<area>-<descrizione-breve>
- esempio:
fix/admin-settings-toast-save
- Commit:
<type>(<scope>): <summary>
- esempio:
refactor(quests): replace hardcoded navbar slot with extension point
Riferimento completo:
CONTRIBUTING.md(sezioni workflow Git, policy review/merge, esempi codice, Definition of Done)
Nota operativa su login
- Endpoint base login:
POST /signin. - Se il backend risponde
error_character_select, il frontend deve aprire la modale selezione personaggio e usare:
POST /signin/characters/listPOST /signin/character/select
- Non bypassare la selezione lato client: la sessione personaggio va sempre finalizzata server-side.
Standard frontend
- Ogni pagina usa feature controller dedicato.
- Logica API in moduli (
assets/js/app/modules/*), non nelle view. - Componenti shared in
assets/js/components/*solo se riuso reale. - UI permessi con DSL
data-requires-*, ma backend resta autoritativo. - Modali/offcanvas: lifecycle pulito (no overlay incrociati).
- Pipeline stili:
assets/sass/e sorgente,assets/css/e compilato. - Le modifiche tema/framework vanno fatte in Sass, poi ricompilate in CSS.
Standard backend
- Validazione input lato controller.
- Business rules nei service.
- Error code coerenti e stabili.
- Patch SQL idempotenti; una volta integrate in
database/logeon_db_core.sqli file patch separati vanno eliminati. - Nessuna dipendenza hard del core da moduli opzionali.
- Per nuove dipendenze runtime nel core, preferire i contratti esposti da
Core\AppContext(session, auth context, renderer, config repository, db provider) invece di chiamate statiche dirette. - Le interfacce di dominio appartengono a
app/Contracts/(namespaceApp\Contracts), non aapp/Services/. - I modelli (
app/Models/) estendonoCore\Modelscon$table,$primary_keye$fillable; nessuna logica di business al loro interno.
Verifiche minime prima di commit
php -lsu ogni file PHP toccato.node --checksui file JS toccati.- Standard PHP (PSR tranche attive):
composer run lint:phpcomposer run psr:check
- Smoke core:
C:\xampp\php\php.exe scripts/php/smoke-core-db-runtime.phpC:\xampp\php\php.exe scripts/php/smoke-core-auth-runtime.phpC:\xampp\php\php.exe scripts/php/smoke-core-runtime.php
- Smoke funzionale della feature toccata.
Checklist Pull Request
- Problema e obiettivo descritti chiaramente.
- Soluzione spiegata per blocchi (backend/frontend/DB).
- Permessi verificati.
- Contratti API aggiornati se necessario.
- Changelog aggiornato in
docs/changelog.mdcon sezioneAggiunto/Modificato/Bugfix/Verifica tecnica. - Nessun file temporaneo (
tmp_*, patch helper) lasciato nel repo.
Manutenzione documentazione
- Nomi file parlanti e senza data nel filename.
- Ogni guida deve avere riga
Ultimo aggiornamento. - Preferire documenti unificati invece di tanti file frammentati.