Quando il framework rilascia una nuova versione major, i moduli esistenti possono richiedere modifiche al codice per adeguarsi alle breaking changes introdotte. SismaFramework fornisce un comando di upgrade automatico che analizza i file di un modulo, applica le trasformazioni necessarie e genera un report dettagliato delle modifiche effettuate.
Il sistema di upgrade si basa su una pipeline di strategy e transformer:
module.json presente nella root del modulo.framework_version nel file module.json viene aggiornato alla versione di destinazione.
Per il corretto funzionamento del comando di upgrade, è necessario che:
module.json nella propria root con un campo framework_version (o version) che indichi la versione corrente del framework a cui è allineato.Application/ con le sottocartelle Controllers/, Models/, Forms/, Entities/).zip sia disponibile per la creazione automatica del backup.
{
"name": "Blog",
"framework_version": "10.1.7"
}
Il comando viene eseguito dalla riga di comando, dalla root del progetto:
php SismaFramework/Console/sisma upgrade <module> [options]
<module>: il nome del modulo da aggiornare (es. Blog, Catalog).| Opzione | Descrizione |
|---|---|
--to=VERSION | Versione di destinazione del framework (es. 11.0.0). Obbligatoria. |
--from=VERSION | Versione di partenza. Se omessa, viene rilevata automaticamente dal file module.json. |
--dry-run | Esegue una simulazione senza modificare alcun file. Fortemente consigliato come primo passaggio. |
--skip-critical | Esclude dall'elaborazione i file critici (Public/index.php, file nella cartella Config/). |
--skip-backup | Salta la creazione del backup automatico (sconsigliato). |
--quiet | Modalità con output minimale. |
Eseguire sempre prima una simulazione per verificare le modifiche che verranno applicate:
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0 --dry-run
Il sistema analizzerà tutti i file del modulo e mostrerà un report dettagliato delle trasformazioni previste, senza toccare alcun file.
Dopo aver verificato il report, eseguire il comando senza --dry-run:
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0
Verrà creato un backup automatico del modulo (es. Blog_backup_20250115143022.zip) e le modifiche verranno applicate. Se il modulo si trova all'interno di un repository Git, verrà inoltre creato un commit di pre-backup.
Il report di upgrade può segnalare azioni manuali necessarie. Queste vanno eseguite manualmente dopo l'upgrade automatico.
Al termine dell'upgrade, è fondamentale eseguire la suite di test del modulo per verificare che tutto funzioni correttamente.
# Anteprima dell'upgrade (sicuro, consigliato come primo passaggio)
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0 --dry-run
# Applicazione dell'upgrade dopo aver verificato il dry-run
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0
# Upgrade specificando la versione di partenza
php SismaFramework/Console/sisma upgrade Blog --from=10.1.7 --to=11.0.0
# Esclusione dei file critici (revisione manuale successiva)
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0 --skip-critical
# Output minimale
php SismaFramework/Console/sisma upgrade Blog --to=11.0.0 --quiet
La strategia attualmente disponibile gestisce l'aggiornamento dalla versione major 10 alla versione major 11. Vengono applicati i seguenti transformer:
Le classi ErrorHandler e Debugger sono state convertite da classi con metodi statici a classi con metodi di istanza. Il transformer individua le chiamate statiche (es. ErrorHandler::metodo()) e le converte in chiamate di istanza (es. $errorHandler->metodo()).
Nel file Public/index.php il transformer inserisce automaticamente l'istanziamento degli oggetti dopo il require dell'autoload e aggiorna la creazione del Dispatcher per iniettare il Debugger.
Prima:
ErrorHandler::handleNonThrowableError();
Debugger::init();
$dispatcher = new Dispatcher();
Dopo:
$errorHandler = new ErrorHandler();
$debugger = new Debugger();
$errorHandler->registerNonThrowableErrorHandler();
$debugger->init();
$dispatcher = new Dispatcher(debugger: $debugger);
Il metodo BaseForm::customFilter() ha cambiato il tipo di ritorno da void a bool. Il transformer aggiorna automaticamente la firma del metodo nei file all'interno della cartella Forms/ e aggiunge le istruzioni return appropriate:
return false; dopo ogni assegnazione di errore ($this->formFilterError->... = true;)return true; alla fine del metodoPrima:
protected function customFilter(): void
{
if ($this->entity->name === '') {
$this->formFilterError->name = true;
}
}
Dopo:
protected function customFilter(): bool
{
if ($this->entity->name === '') {
$this->formFilterError->name = true;
return false;
}
return true;
}
Il metodo Response::setResponseType() e' stato rimosso in favore dell'iniezione tramite costruttore. Il transformer individua il pattern di creazione di un oggetto Response seguito dalla chiamata a setResponseType() e li unifica in un'unica istruzione.
Prima:
$response = new Response();
$response->setResponseType(ResponseType::Json);
Dopo:
$response = new Response(ResponseType::Json);
Se il pattern risulta troppo complesso per la trasformazione automatica, viene emesso un warning con la richiesta di revisione manuale.
Il transformer di rinomina gestisce i metodi il cui nome e' cambiato tra le due versioni. Ad esempio:
| Metodo Precedente | Nuovo Metodo |
|---|---|
handleNonThrowableError() | registerNonThrowableErrorHandler() |
La strategia segnala le seguenti breaking changes che possono richiedere intervento manuale:
ErrorHandler e Debugger: metodi statici convertiti in metodi di istanzaBaseForm::customFilter(): tipo di ritorno cambiato da void a boolResponse::setResponseType(): metodo rimosso in favore dell'iniezione tramite costruttoreErrorHandler::handleNonThrowableError(): rinominato in registerNonThrowableErrorHandler()Public/index.php: richiede aggiornamento per istanziare ErrorHandler e Debugger
La strategia Upgrade11to12Strategy gestisce le due breaking change della versione 12.0.0 tramite due transformer dedicati.
SelfReferencedModel in SelfDependentModel
Il transformer ClassRenameTransformer (confidence: 95%) rinomina automaticamente ogni occorrenza dell'identificatore — dichiarazioni extends, statement use, riferimenti a enum case e stringhe letterali — usando un confronto a word boundary. Nessun intervento manuale richiesto.
Prima:
use SismaFramework\Orm\BaseClasses\SelfReferencedModel;
class CategoryModel extends SelfReferencedModel
Dopo:
use SismaFramework\Orm\BaseClasses\SelfDependentModel;
class CategoryModel extends SelfDependentModel
setFulltextIndexColumn()
Il transformer FulltextIndexColumnTransformer (confidence: 70%) riordina gli argomenti posizionali di setFulltextIndexColumn() per riflettere la nuova firma (array $columns, $value, TextSearchMode $textSearchMode, ?string $columnAlias, bool $append):
requiresManualReview perché l'ordine non è deducibile con certezza.SelfReferencedModel → SelfDependentModel (classe rinominata)Query::setFulltextIndexColumn(): il parametro TextSearchMode precede ora $columnAlias e $appendgetEntityCollectionByEntity(), countEntityCollectionByEntity(), deleteEntityCollectionByEntity() e le relative varianti ...ByParentAndEntity() di SelfDependentModel) in favore delle query dinamiche getBy{PropertyName}()/countBy{PropertyName}()/deleteBy{PropertyName}()Al termine dell'esecuzione, il comando genera un report che include:
SUCCESS, DRY-RUN o erroreOgni transformer dichiara un livello di confidenza che indica l'affidabilita' della trasformazione automatica:
| Livello | Significato |
|---|---|
| 80-100% | Trasformazione sicura, alta probabilita' di correttezza |
| 65-79% | Trasformazione generalmente corretta, consigliata una verifica |
| < 65% | Trasformazione incerta, revisione manuale necessaria |
Il sistema classifica i file del modulo nelle seguenti categorie:
| Categoria | Percorso | Elaborazione |
|---|---|---|
form | Application/Forms/ | Sempre elaborato |
controller | Application/Controllers/ | Sempre elaborato |
model | Application/Models/ | Sempre elaborato |
entity | Application/Entities/ | Sempre elaborato |
critical | Public/index.php, Config/ | Elaborato salvo --skip-critical |
other | Tutti gli altri file | Escluso dall'elaborazione |
Se non viene specificata l'opzione --skip-backup, il sistema crea automaticamente un archivio ZIP del modulo prima di applicare le modifiche. Il file viene salvato nella stessa directory del modulo con il formato <NomeModulo>_backup_<timestamp>.zip.
In caso di errore durante l'applicazione delle trasformazioni, il sistema esegue automaticamente il rollback ripristinando il modulo dallo stato del backup.
Se il modulo si trova all'interno di un repository Git, viene inoltre creato un commit con il messaggio Pre-upgrade backup - <timestamp> prima dell'applicazione delle modifiche.
Indice | Precedente: Scaffolding | Successivo: Barra di Debug
Se hai trovato errori o vuoi suggerire miglioramenti, apri una issue su GitHub.
Report Issue Edit on GitHub