Symfony ObjectMapper riduce le assegnazioni manuali quando converti un DTO in un’entità o in un altro oggetto: installi symfony/object-mapper, inietti ObjectMapperInterface e chiami map(). Le proprietà con nomi corrispondenti possono essere copiate automaticamente; per rinominare, filtrare o trasformare valori e per convertire collezioni servono regole esplicite. Alcune comodità descritte qui, tra cui IsNotNull, richiedono Symfony 8.1.
Che cos’è ObjectMapper e quando usarlo
ObjectMapper trasforma un oggetto sorgente in un oggetto destinazione, per esempio un DTO in un’entità o viceversa. Symfony descrive il componente come un modo per semplificare queste conversioni e separare i modelli usati da API e applicazioni interne (documentazione Symfony Object Mapper).
As an Amazon Associate I earn from qualifying purchases.
È utile quando vuoi evitare di copiare a mano una serie di proprietà corrispondenti. Non sostituisce però ogni decisione di mapping: nomi diversi, conversioni di tipo, condizioni e contenuti di collezioni possono richiedere configurazione. Il mapping automatico non equivale a una conversione universale di qualunque oggetto.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Installare e usare il mapping di base
- Installa il componente: dalla directory del progetto esegui
composer require symfony/object-mapper. - Dichiara la destinazione: usa l’attributo
#[Map(target: Product::class)]sulla classe DTO, come nello schema seguente. - Inietta il mapper: in un’app Symfony,
ObjectMapperInterfaceè autowired. - Avvia la conversione: passa il DTO a
map(). Se la destinazione è una classe configurata, il mapper crea l’oggetto; puoi anche passare un oggetto già esistente per aggiornarlo.
<?php
use AppEntityProduct;
use SymfonyComponentObjectMapperAttributeMap;
use SymfonyComponentObjectMapperObjectMapperInterface;
#[Map(target: Product::class)]
class ProductInput
{
public string $name = '';
public string $sku = '';
}
final class ProductService
{
public function __construct(private ObjectMapperInterface $mapper)
{
}
public function fromInput(ProductInput $input): Product
{
return $this->mapper->map($input);
}
}
È uno schema didattico: il codice concreto deve rispettare le proprietà e i costruttori effettivi delle classi del progetto. Nel mapping diretto, le proprietà con nomi corrispondenti vengono copiate; quelle senza una proprietà corrispondente nella destinazione sono ignorate (documentazione Symfony Object Mapper).
#1 Best Overall
Personalizzare nomi, condizioni e trasformazioni con #[Map]
Quando una proprietà sorgente e una destinazione non hanno lo stesso nome, #[Map] può indicare la proprietà da usare. Per esempio, #[Map(target: 'email')] su una proprietà sorgente la indirizza alla proprietà email della destinazione. Se le regole sono dichiarate sul target, source indica invece da quale proprietà leggere.
L’attributo supporta anche condizioni con if e trasformazioni con transform. La condizione permette di saltare o subordinare la copia; la trasformazione può usare una callable o un servizio transformer. Nella versione documentata per Symfony 8.1, una callable non risolvibile genera NoSuchCallableException: non trattarla come una proprietà semplicemente ignorata. Per le capacità di base si veda anche la documentazione Object Mapper di Symfony 7.3; le modifiche 8.1 sono descritte nel post ufficiale Symfony 8.1.
Gestire gli aggiornamenti parziali e i valori null
Se mappi un DTO su un oggetto già esistente, un valore null può sovrascrivere quello già presente, a meno che il mapping non preveda di saltarlo. Symfony 8.1 introduce IsNotNull, una condizione applicabile alle proprietà nullable per lasciare invariato il target quando il valore ricevuto è null.
Recommended Free Tools
null e “campo assente” non sono necessariamente la stessa cosa nel contratto di una API. IsNotNull tratta il valore null; la semantica di un campo omesso va definita dal contratto e dal modo in cui il DTO viene popolato.
Rank #3
Convertire collezioni esplicitamente
ObjectMapper non converte automaticamente gli elementi di una collezione. Se una proprietà contiene un array di oggetti, configura MapCollection per trasformarli; senza questa regola la collezione resta invariata. Da Symfony 8.1, MapCollection(targetClass: ...) permette di specificare la classe di destinazione degli elementi. La documentazione corrente illustra il mapping delle collezioni e il blog Symfony dettaglia l’aggiunta di targetClass in 8.1 (documentazione; novità di Symfony 8.1).
Quali funzionalità dipendono da Symfony 8.1
“Symfony 8” comprende minor version differenti: non attribuire le novità 8.1 a ogni installazione della serie. La documentazione corrente e il post ufficiale indicano come introdotte in 8.1 diverse capacità utili:
Rank #4
- Class map automatico nell’integrazione Symfony.
- Regole dichiarate sulla classe destinazione con
#[Map(source: ...)]. - La condizione
IsNotNullper saltare i valori null. MapCollection(targetClass: ...)per specificare la classe degli elementi convertiti.- Condizioni basate su più classi e merge di oggetti annidati che mappano sulla stessa destinazione.
- Un’eccezione dedicata,
NoSuchCallableException, quando una callable configurata non è risolvibile.
Dichiarare le regole sul target può mantenere il modello di dominio libero dai metadati di mapping: l’oggetto di destinazione non deve necessariamente conoscere i DTO da cui può essere popolato.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsObjectMapper non è il binding della richiesta HTTP
Per deserializzare direttamente il payload HTTP in un DTO del controller, Symfony documenta MapRequestPayload, che consente anche di configurare contesto e resolver. È un passaggio distinto dalla conversione successiva da DTO a entità: il primo porta la richiesta nel DTO, ObjectMapper può poi trasformare un oggetto in un altro (documentazione Symfony Controller).
Quick Recap
Best Value
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




