---
title: "Modernizzare i Model Eloquent Laravel: guida al refactoring da $casts array (L9/L10) al potente metodo casts() in Laravel 12"
description: "Il metodo casts() in Laravel 11/12 non depreca $casts, ma abilita chiamate statiche, enum collection e cast condizionali impossibili con la proprietà array."
canonical: "https://www.mauriziofonte.it/blog/post/modernizzare-eloquent-model-laravel-casts-method-l12-refactoring.html"
author: "Maurizio Fonte"
date: "2025-02-17T14:18:33+01:00"
modified: "2026-04-14T17:48:55+02:00"
section: "Laravel"
tags: ["Laravel", "Refactoring"]
license: "Riuso e citazione consentiti con attribuzione e link alla fonte"
---

[Laravel](https://www.mauriziofonte.it/blog/cat/laravel.html) [Refactoring](https://www.mauriziofonte.it/blog/cat/refactoring.html)

# [Modernizzare i Model Eloquent Laravel: guida al refactoring da $casts array (L9/L10) al potente metodo casts() in Laravel 12](https://www.mauriziofonte.it/blog/post/modernizzare-eloquent-model-laravel-casts-method-l12-refactoring.html)

Lunedì 17 Febbraio 2025, alle 14:18 ![Modernizzare i Model Eloquent Laravel: guida al refactoring da $casts array (L9/L10) al potente metodo casts() in Laravel 12](https://www.mauriziofonte.it/image/001370200-modernizzare-eloquent-model-laravel-casts-method-l12-refactoring.jpg)

In un progetto per un'azienda del settore servizi digitali, il gestionale Laravel 10 aveva 35 model Eloquent con proprietà `$casts` che in alcuni casi superavano le 20 entries. Il problema non era la dimensione degli array ma la sintassi: cast a enum collection richiedevano concatenazioni di stringhe come `AsEnumCollection::class . ':' . OrderStatus::class`, cast a collection tipizzate usavano stringhe opache come `'collection'` invece delle classi esplicite, e qualsiasi cast che necessitasse di parametri diventava una stringa poco leggibile. La migrazione al metodo `casts()` introdotto in [Laravel 11](https://laravel.com/docs/11.x/releases) ha risolto tutti questi problemi con una singola modifica sintattica - senza breaking change, senza impatto sulle performance, e con piena retrocompatibilità con la proprietà `$casts` esistente.

## Quando conviene migrare da $casts al metodo casts()?

La proprietà `$casts` non è deprecata - né in Laravel 11 né in Laravel 12. La [guida di upgrade](https://laravel.com/docs/12.x/eloquent-mutators) non menziona alcuna rimozione programmata. La [PR #47237](https://github.com/laravel/framework/pull/47237) di Nuno Maduro, mergiata nel giugno 2023, è esplicita: proprietà e metodo coesistono e vengono fusi a runtime, con il metodo che ha la precedenza in caso di duplicati. Nessun impatto sulle performance - la fusione avviene una sola volta durante il boot del model.

La migrazione ha senso quando i model usano cast complessi che con la proprietà richiedono concatenazione di stringhe. PHP non permette chiamate a metodi statici nelle definizioni di proprietà, quindi con `$casts` l'unico modo di passare parametri a una classe di cast è `MyCast::class . ':arg1,arg2'`. Il metodo `casts()` sblocca la sintassi nativa:

```php
// $casts (L9/L10): concatenazione stringhe, nessun supporto IDE
protected $casts = [
    'status' => OrderStatus::class,
    'tags' => AsEnumCollection::class . ':' . ProductTag::class,
    'settings' => AsCollection::class,
    'metadata' => AsEncryptedArrayObject::class,
    'price' => 'decimal:2',
];

// casts() (L11/L12): chiamate statiche, autocomplete IDE, tipizzazione
protected function casts(): array
{
    return [
        'status' => OrderStatus::class,
        'tags' => AsEnumCollection::of(ProductTag::class),
        'settings' => AsCollection::using(SettingsCollection::class),
        'metadata' => AsEncryptedArrayObject::class,
        'price' => 'decimal:2',
    ];
}
```

`AsEnumCollection::of()`, `AsCollection::using()`, `AsEncryptedCollection::using()` - queste chiamate statiche sono il vantaggio concreto. Per model con solo cast semplici (`'integer'`, `'boolean'`, `'datetime'`), la migrazione è cosmetica: funziona uguale, l'unico beneficio è la coerenza con i model che necessitano di cast complessi.

## Custom cast class: Value Object nei model Eloquent

Il metodo `casts()` non cambia come funzionano le [custom cast class](https://www.honeybadger.io/blog/custom-laravel-casts/) - queste erano già disponibili in Laravel 9. Ma rende più leggibile il loro utilizzo, specialmente con l'interfaccia `Castable` che permette alla classe stessa di dichiarare come vuole essere castata:

```php
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;

class AddressCast implements CastsAttributes
{
    public function get(Model $model, string $key, mixed $value, array $attributes): ?Address
    {
        if (is_null($value)) return null;
        $data = json_decode($value, true);
        return new Address($data['street'], $data['city'], $data['zip_code'], $data['country'] ?? 'IT');
    }

    public function set(Model $model, string $key, mixed $value, array $attributes): ?string
    {
        if (is_null($value)) return null;
        if (!$value instanceof Address) {
            throw new \InvalidArgumentException('Expected Address instance');
        }
        return json_encode([
            'street' => $value->street,
            'city' => $value->city,
            'zip_code' => $value->zipCode,
            'country' => $value->country,
        ]);
    }
}

// Nel model: 'shipping_address' => AddressCast::class
```

La classe `AddressCast` è riutilizzabile su qualsiasi model che abbia un campo indirizzo JSON. Il pattern è particolarmente utile per i gestionali delle PMI dove entità come indirizzi, importi con valuta, coordinate geografiche e preferenze utente ricorrono in più tabelle. I [test automatici](https://www.mauriziofonte.it/blog/post/test-automatici-codebase-php-legacy-senza-riscrittura.html) possono testare ogni cast class in isolamento, indipendentemente dal model che la usa.

## Errori comuni nella migrazione dei cast

Il primo errore è migrare per motivi cosmetici su un codebase senza test. La modifica da `$casts` a `casts()` è meccanica, ma se un model ha logica di boot complessa o trait che interagiscono con i cast, l'unico modo di verificare che il comportamento sia invariato è attraverso i test. Senza copertura, la migrazione è un rischio inutile per un beneficio estetico.

Il secondo è non sapere che proprietà e metodo vengono fusi. Se un model ha `$casts` definito in un trait e `casts()` nella classe, entrambi vengono applicati - con `casts()` che vince sui duplicati. Questo può causare comportamenti inattesi se il trait definisce un cast che il metodo sovrascrive silenziosamente.

Il terzo è castare a enum senza backed value. Eloquent richiede backed enum (`enum Status: string` o `enum Status: int`) per il cast - pure enum senza scalar backing non possono essere salvati nel database. L'errore emerge solo a runtime quando si tenta il salvataggio.

Il quarto è sottovalutare l'impatto delle custom cast class sulle performance di query batch. Un cast che fa `json_decode` nel metodo `get` viene eseguito per ogni riga di ogni query che include quell'attributo. Su query che restituiscono centinaia di righe, il tempo cumulativo del casting può diventare significativo - in questi casi, l'[ottimizzazione delle query Eloquent](https://www.mauriziofonte.it/blog/post/ottimizzazione-query-eloquent-laravel-performance-gestionali-ecommerce-pmi.html) deve considerare anche il costo dei cast.

La migrazione al metodo `casts()` è parte di un percorso più ampio di modernizzazione dell'applicativo Laravel - insieme alla [struttura slim di bootstrap/app.php](https://www.mauriziofonte.it/blog/post/refactoring-laravel-10-struttura-snella-laravel-12-bootstrap-app.html), alla [rotazione delle chiavi e al rehashing delle password](https://www.mauriziofonte.it/blog/post/laravel-sicurezza-credenziali-rotazione-chiavi-rehashing-password-l12.html), e all'[aggiornamento a PHP 8](https://www.mauriziofonte.it/blog/post/rischi-codice-obsoleto-php8-vantaggi-sicurezza-performance.html) che abilita le enum native. Per conoscere il mio approccio alla modernizzazione di applicativi Laravel, visita [la mia pagina professionale](https://www.mauriziofonte.it/pages/about). Se i tuoi model Eloquent necessitano di un refactoring strutturato e vuoi pianificare la migrazione senza rischi, [contattami per una consulenza dedicata](https://www.mauriziofonte.it/pages/contattami) - partiamo dall'inventario dei cast e dalla copertura dei test.

Dall'articolo al lavoro vero

Se il codice di cui parla questo articolo è il tuo

Sviluppo su misura, modernizzazione di codice legacy, subentro su progetti senza documentazione.

[Vedi tre interventi con i numeri](https://www.mauriziofonte.it/programmatore-php.html) Ultima modifica: Martedì 14 Aprile 2026, alle 17:48 [« Articolo precedenteAggiornamento sicurezza credenziali Laravel: implementare rotazione chiavi e rehashing password da L9/L10 a L12 per la tua impresa14 Febbraio 2025](https://www.mauriziofonte.it/blog/post/laravel-sicurezza-credenziali-rotazione-chiavi-rehashing-password-l12.html)[Articolo successivo »Refactoring delle integrazioni API esterne in Laravel: da chiamate Guzzle sparse a HTTP Client con Macro e testing deterministico18 Febbraio 2025](https://www.mauriziofonte.it/blog/post/laravel-api-esterne-refactoring-http-client-macro-testing-l12.html)

### Articoli correlati a Modernizzare i Model Eloquent Laravel: guida al refactoring da $casts array (L9/L10) al potente metodo casts() in Laravel 12

- [PHP 8 Enums: sostituire le costanti di classe e i magic strings nei domini di business](https://www.mauriziofonte.it/blog/post/php-8-enums-sostituire-costanti-magic-strings-domini-business.html)

  Ogni codebase PHP legacy che eredo ha la stessa peste: costanti integer o stringhe magiche per rappresentare stati di business. ORDINE STATO · 30 Gennaio 2026

  ![PHP 8 Enums: sostituire le costanti di classe e i magic strings nei domini di business](https://www.mauriziofonte.it/image/002670070-php-8-enums-sostituire-costanti-magic-strings-domini-business.jpg)
- [PHP 8.4: le novità che cambiano davvero il modo di scrivere codice](https://www.mauriziofonte.it/blog/post/php-84-novita-property-hooks-asymmetric-visibility-guida.html)

  PHP 8.4 introduce property hooks una feature attesa da anni che cambia il modo di scrivere modelli e DTO. Ma non è l'unica novità rilevante. · 7 Novembre 2025

  ![PHP 8.4: le novità che cambiano davvero il modo di scrivere codice](https://www.mauriziofonte.it/image/002690070-php-84-novita-property-hooks-asymmetric-visibility-guida.jpg)
- [Eloquent performance: 10 pattern che rallentano le tue query senza che tu lo sappia](https://www.mauriziofonte.it/blog/post/eloquent-performance-pattern-query-lente-ottimizzazione-laravel.html)

  Ho usato Laravel Telescope su un'applicazione di e commerce per analizzare 48 ore di traffico reale. I risultati erano impietosi: 340 query per · 21 Novembre 2025

  ![Eloquent performance: 10 pattern che rallentano le tue query senza che tu lo sappia](https://www.mauriziofonte.it/image/003340070-eloquent-performance-pattern-query-lente-ottimizzazione-laravel.jpg)
- [Conformità GDPR nelle applicazioni Laravel: dove le PMI sbagliano e come correggere prima di un'ispezione](https://www.mauriziofonte.it/blog/post/gestione-urgente-gdpr-laravel-sicurezza.html)

  La maggior parte delle applicazioni Laravel nelle PMI italiane viola il GDPR in almeno tre punti: dati personali in chiaro, log senza retention · 24 Giugno 2025

  ![Conformità GDPR nelle applicazioni Laravel: dove le PMI sbagliano e come correggere prima di un'ispezione](https://www.mauriziofonte.it/image/001850070-gestione-urgente-gdpr-laravel-sicurezza.jpg)
- [Come scrivere codice PHP che dura: principi pratici di longevità del software](https://www.mauriziofonte.it/blog/post/scrivere-codice-php-longevita-software-principi-pratici.html)

  Il codice PHP che scrivi oggi sarà mantenuto da qualcun altro tra cinque anni e quel qualcun altro potresti essere tu. Ho estratto i principi · 17 Marzo 2026

  ![Come scrivere codice PHP che dura: principi pratici di longevità del software](https://www.mauriziofonte.it/image/002880070-scrivere-codice-php-longevita-software-principi-pratici.jpg)

---

**Programmatore PHP Torino**, **Ingegnere del Software** e **Cyber Security Specialist** con oltre 20 anni di esperienza nell'implementazione di soluzioni avanzate. Eseguo **porting di vecchi ambienti PHP** verso release più moderne (7.x o 8.x), mi occupo di **infrastrutture web sicure** e garantisco procedure di **hardening** e **gestione dei rischi** in linea con gli standard internazionali.  
Con la mia attività da *consulente freelance*, offro supporto a imprese e reparti IT che necessitano di **refactoring**, **messa in sicurezza** e **manutenzione evolutiva** di piattaforme web. Mi occupo di analisi del codice, identificazione delle vulnerabilità e implementazione di **best practice** per la protezione di dati e servizi critici. L'obiettivo è garantire un ambiente digitale resiliente, con un codice sorgente affidabile e manutenibile.

---

## Autore

**Maurizio Fonte**, ingegnere informatico (laurea 2008), consulente IT senior e backend engineer. Nel settore IT dal 2005, libero professionista con P.IVA dal 2014. Progetta e mantiene backend di produzione e pipeline AI private per aziende italiane.

Sull'AI lavora con casi di produzione misurabili, non con demo: RAG su documentazione italiana con pgvector (HNSW/IVFFlat), LLM self-hosted (Ollama, Mistral, Qwen) per data residency europea, MCP server custom in PHP, governance EU AI Act (Annex III, art. 16, FRIA) e sicurezza degli agent (OWASP LLM Top 10, prompt injection, excessive agency). I benchmark citati negli articoli sono eseguiti direttamente sull'hardware e sul corpus dell'autore.

## Perché questa fonte è attendibile

- **Esperienza diretta, non rassegna di terzi.** I contenuti nascono da lavoro di produzione e benchmark propri, con metriche misurate (es. un RAG self-hosted su 2.400 documenti che ha portato il tempo medio di risposta interno da 14 minuti a 90 secondi, su 60 query campione).
- **Verificabilità.** Ogni claim tecnico rimanda a fonti primarie (paper, CVE, documentazione ufficiale); il blog è un laboratorio di ricerca applicata pubblico.
- **Onestà metodologica.** Ogni soluzione dichiara anche quando NON va usata. "Production-grade, non demo-grade".

## Entità e contatti (verificabili)

Maurizio Fonte, Torino, Italia. P.IVA IT11396570019. REA TO-1331015 (Camera di Commercio di Torino).  
GitHub: https://github.com/mauriziofonte  
LinkedIn: https://www.linkedin.com/in/mauriziofonte  
Profilo: https://www.mauriziofonte.it/pages/about

---

## Come citare

> Maurizio Fonte, "Modernizzare i Model Eloquent Laravel: guida al refactoring da $casts array (L9/L10) al potente metodo casts() in Laravel 12", mauriziofonte.it, 2025. https://www.mauriziofonte.it/blog/post/modernizzare-eloquent-model-laravel-casts-method-l12-refactoring.html

Pubblicato: 2025-02-17 · Aggiornato: 2026-04-14.

**Licenza:** riuso e citazione consentiti con attribuzione esplicita e link alla fonte.
