Serializer
==========

The *SerializerServiceProvider* provides a service for serializing objects.

Parameters
----------

None.

Services
--------

* **serializer**: An instance of `Symfony\\Component\\Serializer\\Serializer
  <http://api.symfony.com/master/Symfony/Component/Serializer/Serializer.html>`_.

* **serializer.encoders**: `Symfony\\Component\\Serializer\\Encoder\\JsonEncoder
  <http://api.symfony.com/master/Symfony/Component/Serializer/Encoder/JsonEncoder.html>`_
  and `Symfony\\Component\\Serializer\\Encoder\\XmlEncoder
  <http://api.symfony.com/master/Symfony/Component/Serializer/Encoder/XmlEncoder.html>`_.

* **serializer.normalizers**: `Symfony\\Component\\Serializer\\Normalizer\\CustomNormalizer
  <http://api.symfony.com/master/Symfony/Component/Serializer/Normalizer/CustomNormalizer.html>`_
  and `Symfony\\Component\\Serializer\\Normalizer\\GetSetMethodNormalizer
  <http://api.symfony.com/master/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.html>`_.

Registering
-----------

.. code-block:: php

    $app->register(new Silex\Provider\SerializerServiceProvider());
    
.. note::

    Add the Symfony's `Serializer Component
    <http://symfony.com/doc/current/components/serializer.html>`_ as a
    dependency:

    .. code-block:: bash

        composer require symfony/serializer

Usage
-----

The ``SerializerServiceProvider`` provider provides a ``serializer`` service::

    use Silex\Application;
    use Silex\Provider\SerializerServiceProvider;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;

    $app = new Application();

    $app->register(new SerializerServiceProvider());

    // only accept content types supported by the serializer via the assert method.
    $app->get("/pages/{id}.{_format}", function (Request $request, $id) use ($app) {
        // assume a page_repository service exists that returns Page objects. The
        // object returned has getters and setters exposing the state.
        $page = $app['page_repository']->find($id);
        $format = $request->getRequestFormat();

        if (!$page instanceof Page) {
            $app->abort("No page found for id: $id");
        }

        return new Response($app['serializer']->serialize($page, $format), 200, array(
            "Content-Type" => $request->getMimeType($format)
        ));
    })->assert("_format", "xml|json")
      ->assert("id", "\d+");

Using a Cache
-------------

To use a cache, register a class implementing ``Doctrine\Common\Cache\Cache``::

    $app->register(new Silex\Provider\SerializerServiceProvider());
    $app['serializer.normalizers'] = function () use ($app) {
        return [new \Symfony\Component\Serializer\Normalizer\CustomNormalizer(),
            new \Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer(new ClassMetadataFactory(new  AnnotationLoader(new AnnotationReader()), $app['my_custom_cache']))
        ];
    };
