Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Con ObjectMapper puoi copiare proprietà compatibili da un DTO a un’entità senza scrivere un’assegnazione per ciascun campo. Installi symfony/object-mapper, inietti ObjectMapperInterface e chiami map(). Per nomi diversi, condizioni, trasformazioni e collezioni, però, servono regole esplicite. Inoltre, alcune funzioni descritte qui sono specifiche di Symfony 8.1.

Che cosa fa ObjectMapper

Symfony descrive ObjectMapper come un componente che trasforma un oggetto in un altro, ad esempio un DTO in un’entità o viceversa. È utile per separare i modelli usati dall’API da quelli interni all’applicazione e ridurre il codice ripetitivo di assegnazione. Non sostituisce ogni logica di conversione: il mapping automatico copre soprattutto le proprietà compatibili, mentre gli altri casi vanno dichiarati.

La documentazione corrente è disponibile nella guida ufficiale a Object Mapper. Per le funzionalità introdotte in Symfony 8.1, vedere anche l’annuncio New in Symfony 8.1: ObjectMapper Improvements.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Installazione e primo mapping

Installa il componente con Composer:

composer require symfony/object-mapper

Nell’integrazione Symfony, ObjectMapperInterface viene autowired. Puoi dichiarare la classe di destinazione sul DTO con #[Map(target: ...)] e poi chiamare map() senza passare un secondo argomento.

<?php

use AppEntityProduct;
use SymfonyComponentObjectMapperAttributeMap;

#[Map(target: Product::class)]
class ProductInput
{
    public string $name = '';
    public string $sku = '';
}

final class ProductService
{
    public function __construct(
        private SymfonyComponentObjectMapperObjectMapperInterface $mapper,
    ) {
    }

    public function fromInput(ProductInput $input): Product
    {
        return $this->mapper->map($input);
    }
}

L’esempio presuppone proprietà compatibili e un’entità istanziabile secondo la configurazione del progetto. Verifica quindi i costruttori, i tipi e le proprietà effettive: l’attributo indica la classe target, ma non elimina i requisiti del tuo modello.

Creare un oggetto o aggiornarne uno esistente

map() accetta una classe di destinazione, così da creare un oggetto nuovo, oppure un oggetto target già esistente da aggiornare. La seconda forma è utile quando vuoi applicare i dati di un DTO a un’entità caricata dal database.

$product = $this->mapper->map($input, $existingProduct);

Con nomi di proprietà corrispondenti, ObjectMapper esegue il mapping diretto; le proprietà sorgente prive di corrispondenza nella destinazione vengono ignorate. Per le capacità di base, la documentazione di Object Mapper per Symfony 7.3 offre un riferimento versionato.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Rinominare, condizionare e trasformare proprietà

Quando i nomi o i valori non coincidono, usa #[Map] per rendere la regola esplicita.

Rank #3
Sale
The Definitive Guide to symfony
  • Used Book in Good Condition
  • Rinominare: #[Map(target: 'email')] indica la proprietà di destinazione per un campo sorgente. L’opzione source è utile quando la regola è dichiarata sulla proprietà target.
  • Condizionare: l’opzione if consente di copiare una proprietà solo quando la condizione è soddisfatta.
  • Trasformare: l’opzione transform applica una callable o un servizio transformer al valore.

In Symfony 8.1, una callable indicata in if o transform che non può essere risolta genera NoSuchCallableException. Un nome errato, quindi, non va trattato come se la proprietà fosse semplicemente ignorata.

Gestire null negli aggiornamenti parziali

In Symfony 8.1, la condizione IsNotNull permette di saltare il mapping quando la proprietà DTO vale null, lasciando invariato il valore già presente nel target. Applicala alle proprietà nullable per cui questo comportamento è voluto.

null e “campo assente” non sono necessariamente equivalenti: il significato dipende dal contratto dell’API e da come il DTO viene popolato. La regola tratta il valore null; non stabilisce da sola la semantica dei campi omessi in una richiesta PATCH.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Mappare collezioni di oggetti

ObjectMapper non converte automaticamente gli elementi di una collezione. Per trasformare una collezione di oggetti sorgente in una di oggetti destinazione, configura esplicitamente MapCollection. In Symfony 8.1, il parametro targetClass consente di specificare la classe degli elementi target. Senza questa trasformazione, la collezione resta invariata.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Che cosa cambia in Symfony 8.1

Non tutte le funzionalità di ObjectMapper sono disponibili in ogni versione minor di Symfony 8. La documentazione corrente segnala come novità di Symfony 8.1, tra le altre, la class map automatica nell’integrazione Symfony, le regole dichiarate sulla classe destinazione con #[Map(source: ...)], IsNotNull, MapCollection(targetClass: ...), condizioni basate su più classi e il merge di oggetti annidati diretti alla stessa destinazione.

Dichiarare le regole sul DTO o view model può mantenere l’entità di dominio libera dai metadati di mapping. Prima di usare una funzione marcata come nuova in 8.1, controlla la minor version del progetto e la relativa documentazione ufficiale corrente.

ObjectMapper non è il binding della richiesta HTTP

Per convertire il payload HTTP in ingresso in un DTO del controller, Symfony mette a disposizione MapRequestPayload, che deserializza la richiesta e permette di configurare contesto e resolver. È un passaggio distinto dal successivo mapping DTO→entità: MapRequestPayload si occupa della richiesta verso il DTO, mentre ObjectMapper trasforma un oggetto sorgente in un oggetto destinazione. La guida Symfony per i controller e MapRequestPayload documenta il primo caso.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Per la sincronizzazione tra campi di un form e modello, Symfony dispone invece di un sistema distinto di data mapper per i form: è un altro problema rispetto alla conversione generale fra oggetti.

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.