Come usare il Serializer

Serializzare e deserializzare da e verso oggetti nei vari formati (p.e. JSON o XML) è un argomento davvero complesso. Symfony dispone di un componente Serializer, che fornisce alcuni strumenti che possono essere sfruttati per una soluzione.

In pratica, prima di iniziare, familiarizzare con serializzatori, normalizzatori e codificatori, leggendo la documentazione del componente Serializer. Si dovrebbe altresì controllare il bundle JMSSerializerBundle, che espande le funzionalità offerte dal serializer di base di Symfony.

Attivare il Serializer

Nuovo nella versione 2.3: Serializer è sempre stato in Symfony, ma prima di Symfony 2.3, bisognava costruirsi il servizio serializer da soli.

Il servizio serializer non è disponibile in modo predefinito. Per abilitarlo, occorre attivarlo nella configurazione:

  • YAML
    # app/config/config.yml
    framework:
        # ...
        serializer:
            enabled: true
    
  • XML
    <!-- app/config/config.xml -->
    <framework:config ...>
        <!-- ... -->
        <framework:serializer enabled="true" />
    </framework:config>
  • PHP
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'enabled' => true
        ),
    ));
    

Aggiungere normalizzatori e codificatori

Una volta attivato, il servizio serializer sarà disponibile dentro il contenitore e sarà caricato con due codificatori (Symfony\Component\Serializer\Encoder\JsonEncoder e Symfony\Component\Serializer\Encoder\XmlEncoder), ma nessun normalizzatore, quindi bisognerà caricarne uno proprio.

Si possono caricare normalizzatori e/o codificatori, aggiungeno i tag serializer.normalizer e serializer.encoder. È altresì possibile impostare una priorità del tag, per decidere l’ordine di abbinamento.

Ecco un esempio su come caricare la classe Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer:

  • YAML
    # app/config/config.yml
    services:
       get_set_method_normalizer:
          class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
          tags:
             - { name: serializer.normalizer }
    
  • XML
    <!-- app/config/config.xml -->
    <services>
        <service id="get_set_method_normalizer" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer">
            <tag name="serializer.normalizer" />
        </service>
    </services>
    
  • PHP
    // app/config/config.php
    use Symfony\Component\DependencyInjection\Definition;
    
    $definition = new Definition(
        'Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer'
    ));
    $definition->addTag('serializer.normalizer');
    $container->setDefinition('get_set_method_normalizer', $definition);
    

Nota

La classe Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer non funziona di proposito. Appena si ha un grafo di oggetti circolare, viene creato un loop infinito quando si chiamano i getter. Questo vuole essere un incoraggiamento ad aggiungere i propri normalizzatori, che siano adatti ai propri casi d’uso.

Tabella dei contenuti

Argomento precedente

Usare più fornitori di utenti

Argomento successivo

Contenitore di servizi

Questa pagina