Meccanismo di trasformazione dei valori degli attributi dei modelli Eloquent in lettura e scrittura. Definizione di accessor e mutator e uso dei cast integrati.
Accessor, mutator e cast sono meccanismi per trasformare i valori degli attributi dei modelli Eloquent quando li leggi o li imposti sull’istanza del modello.
Accessor — trasforma il valore grezzo letto dal DB prima di passarlo all’applicazione
Mutator — trasforma il valore impostato dall’applicazione prima di salvarlo nel DB
Cast — definisce in modo dichiarativo la conversione di tipo di un attributo, senza scrivere metodi aggiuntivi
Per definire un accessor aggiungi un metodo protected al modello. Nome del metodo in camelCase e tipo di ritorno Illuminate\Database\Eloquent\Casts\Attribute.
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Casts\Attribute;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * Ottiene il nome dell'utente. */ protected function firstName(): Attribute { return Attribute::make( get: fn (string $value) => ucfirst($value), ); }}
Alla closure get viene passato il valore grezzo dal DB. Accedi dall’istanza del modello come proprietà first_name.
$user = User::find(1);$firstName = $user->first_name; // valore con ucfirst() applicato
Se vuoi includere il valore calcolato dall’accessor in JSON/array, aggiungilo alla proprietà $appends del modello in snake_case.
La closure get può ricevere come secondo argomento $attributes (tutti gli attributi del modello). Combinando più colonne puoi restituire un value object.
use App\Support\Address;use Illuminate\Database\Eloquent\Casts\Attribute;protected function address(): Attribute{ return Attribute::make( get: fn (mixed $value, array $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], ), );}
Gli accessor che restituiscono value object vengono memorizzati in cache automaticamente per restituire la stessa istanza. Per fare cache anche di tipi base come stringhe e numeri, chiama shouldCache().
I cast sono un modo pratico per dichiarare la conversione di tipo di un attributo senza scrivere accessor/mutator. Nel metodo casts() del modello restituisci un array.
Puoi trattare in modo trasparente colonne JSON/TEXT come array PHP.
protected function casts(): array{ return [ 'options' => 'array', ];}
$user = User::find(1);// Ottieni automaticamente come array PHP$options = $user->options;// Se lo modifichi e salvi, viene serializzato automaticamente in JSON$user->options = array_merge($options, ['theme' => 'dark']);$user->save();
Con l’operatore -> puoi aggiornare anche una specifica chiave del JSON.
Se specifichi un formato, viene usato in fase di serializzazione JSON.
protected function casts(): array{ return [ 'published_at' => 'datetime:Y-m-d', ];}
Per cambiare il formato di serializzazione predefinito per tutte le date, sovrascrivi serializeDate() (non influisce sul formato di salvataggio nel DB).
use DateTimeInterface;protected function serializeDate(DateTimeInterface $date): string{ return $date->format('Y-m-d');}
Con immutable_datetime viene restituito un CarbonImmutable al posto di Carbon. Poiché le manipolazioni non modificano l’istanza originale, è più semplice scrivere codice senza effetti collaterali.