Add a `SerializerServiceProvider`.

Usage
-----

```php
<?php

use Silex\Application;
use Silex\Provider\SerializerServiceProvider;
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 ($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 = $app['request']->getFormat();

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

    return new Response($app['serializer']->serialize($page, $format), 200, array(
        "Content-Type" => $app['request']->getMimeType($format)
    ));
})->assert("_format", "xml|json")
  ->assert("id", "\d+");
```
merged branch marijn/feature/serializer-provider (PR #401)

This PR was merged into the master branch.

Commits
-------

03bccc8 Add a `SerializerServiceProvider`.

Discussion
----------

Add a SerializerServiceProvider

Usage
-----

```php
<?php

use Silex\Application;
use Silex\Provider\SerializerServiceProvider;
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 ($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 = $app['request']->getFormat();

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

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

---------------------------------------------------------------------------

by GromNaN at 2012-06-28T14:29:50Z

You can create this ServiceProvider in its own repository and put a link on the wiki :
https://github.com/fabpot/Silex/wiki/Third-Party-ServiceProviders

---------------------------------------------------------------------------

by fabpot at 2012-06-28T14:38:42Z

I think it makes sense to have this in core.

---------------------------------------------------------------------------

by marijn at 2012-06-28T14:41:03Z

Ok. Haven't tested in "in the wild" yet (working on that as we speak). Any pointers, concerns or other comments are more than welcome :smile:

Should I add more documentation or is this enough?

---------------------------------------------------------------------------

by igorw at 2012-06-28T14:47:03Z

@fabpot I agree. :+1:

Please add some more tests.

---------------------------------------------------------------------------

by marijn at 2012-06-28T14:50:13Z

@igorw in regards to the tests: what would you like to see added? I figured we should only test if the serializer is configured properly, not if it actually serializes.

---------------------------------------------------------------------------

by igorw at 2012-06-28T15:11:06Z

You're right, no need to test serialization. Looks good. :+1:

---------------------------------------------------------------------------

by marijn at 2012-06-28T16:02:20Z

Somehow I have trouble running the full test suite. The swift mailer configuration doesn't seem to work. Is this a known issue?

---------------------------------------------------------------------------

by GromNaN at 2012-06-28T20:33:14Z

A new trait can also be added with the method `serialize()`.

---------------------------------------------------------------------------

by marijn at 2012-06-28T21:34:58Z

At the moment I haven't got a working version of PHP 5.4 so I cannot test traits.

---------------------------------------------------------------------------

by marijn at 2012-06-29T19:01:21Z

It seems to me that adding a `trait` for the serializer doesn't really make any sense: the API for the `Serializer` component is pretty extensive, it would add a lot of methods to the `Application`. What do you think?

---------------------------------------------------------------------------

by stof at 2012-06-30T10:32:07Z

@marijn the trait would cover the simple use of the serializer, i.e. a ``serialize()`` method. It is not intended to cover all possible use cases.

---------------------------------------------------------------------------

by fabpot at 2012-06-30T18:31:32Z

Can you squash your commits before I merge? Thanks.

---------------------------------------------------------------------------

by marijn at 2012-07-10T10:58:58Z

@fabpot this has been squashed. I think it's mergeable :smile:

---------------------------------------------------------------------------

by marijn at 2012-08-17T13:39:17Z

Have I missed something here? To the best of my knowledge, this is mergeable. Please let me know if there is anything I still need to do :smile:

---------------------------------------------------------------------------

by alanbem at 2012-10-27T20:39:02Z

What is status of this PR? Is it going to be merged?

---------------------------------------------------------------------------

by marijn at 2012-10-27T21:14:12Z

I have no clue, @alanbem. If you're in need of a serializer for Silex you can either merge this in your own fork of Silex or use the [`jms/serializer-service-provider`][1] that I released.

[1]: https://github.com/pink-tie/JMSSerializerServiceProvider

---------------------------------------------------------------------------

by igorw at 2012-10-27T23:15:53Z

@fabpot this looks good to me.