Commit 03bccc83 authored by Marijn Huizendveld's avatar Marijn Huizendveld

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+");
```
parent 4679d476
{ {
"hash": "e6e70518ed416cbc558237a189fdce1b", "hash": "80f7ebb825c3b49c5aea743e4828a320",
"packages": [ "packages": [
{ {
"package": "pimple/pimple", "package": "pimple/pimple",
...@@ -46,8 +46,8 @@ ...@@ -46,8 +46,8 @@
{ {
"package": "symfony/http-kernel", "package": "symfony/http-kernel",
"version": "dev-master", "version": "dev-master",
"source-reference": "3ed400b75c0c2eae3e8f6f991210a8930bdd7467", "source-reference": "ff65fbaa20ace7e39ce6df92afe97c5c9586a2d1",
"commit-date": "1341838460" "commit-date": "1341849771"
}, },
{ {
"package": "symfony/routing", "package": "symfony/routing",
...@@ -58,8 +58,8 @@ ...@@ -58,8 +58,8 @@
{ {
"package": "symfony/routing", "package": "symfony/routing",
"version": "dev-master", "version": "dev-master",
"source-reference": "48c201da53b7c3b787609b0f6702456b86939577", "source-reference": "67c72b042d753e6ee3675eb4b0c2165243d34055",
"commit-date": "1341838460" "commit-date": "1341890620"
} }
], ],
"packages-dev": [ "packages-dev": [
...@@ -154,8 +154,8 @@ ...@@ -154,8 +154,8 @@
{ {
"package": "symfony/finder", "package": "symfony/finder",
"version": "dev-master", "version": "dev-master",
"source-reference": "fccf904140dd00656a7cea17ff6f54d78b095649", "source-reference": "53377047bae92edd04e232c79b653d2beb309bf6",
"commit-date": "1341838460" "commit-date": "1341846417"
}, },
{ {
"package": "symfony/form", "package": "symfony/form",
...@@ -166,8 +166,8 @@ ...@@ -166,8 +166,8 @@
{ {
"package": "symfony/form", "package": "symfony/form",
"version": "dev-master", "version": "dev-master",
"source-reference": "57d3b508c1522a1343f7b505b573c307e7ad0023", "source-reference": "b1f4c42f42892008dd5d72449e0074abf81d1e4b",
"commit-date": "1341838460" "commit-date": "1341915525"
}, },
{ {
"package": "symfony/locale", "package": "symfony/locale",
...@@ -229,6 +229,18 @@ ...@@ -229,6 +229,18 @@
"source-reference": "47fcb4bfc03c74ae5b7ba6c6f2c32169e455be02", "source-reference": "47fcb4bfc03c74ae5b7ba6c6f2c32169e455be02",
"commit-date": "1341840540" "commit-date": "1341840540"
}, },
{
"package": "symfony/serializer",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/serializer",
"version": "dev-master",
"source-reference": "cf9b6a457c4ed5a147e3438867049bd1f97e0917",
"commit-date": "1341838460"
},
{ {
"package": "symfony/translation", "package": "symfony/translation",
"version": "dev-master", "version": "dev-master",
...@@ -238,8 +250,8 @@ ...@@ -238,8 +250,8 @@
{ {
"package": "symfony/translation", "package": "symfony/translation",
"version": "dev-master", "version": "dev-master",
"source-reference": "1b50bdbbd88e091a9fdd362b3a0c5e1fb93cf53f", "source-reference": "d2ce6bcdaf479b2121e35fa850fd229817c1ee2a",
"commit-date": "1341838460" "commit-date": "1341851012"
}, },
{ {
"package": "symfony/twig-bridge", "package": "symfony/twig-bridge",
...@@ -250,8 +262,8 @@ ...@@ -250,8 +262,8 @@
{ {
"package": "symfony/twig-bridge", "package": "symfony/twig-bridge",
"version": "dev-master", "version": "dev-master",
"source-reference": "33295b10cad60026f074d0ee614e9a0cbe04e232", "source-reference": "5d3e234a5d366f510185a9de3a545b730f327632",
"commit-date": "1341838460" "commit-date": "1341913448"
}, },
{ {
"package": "symfony/validator", "package": "symfony/validator",
...@@ -262,8 +274,8 @@ ...@@ -262,8 +274,8 @@
{ {
"package": "symfony/validator", "package": "symfony/validator",
"version": "dev-master", "version": "dev-master",
"source-reference": "2d02293c193be5e93019fe7961922a7ce05cddb0", "source-reference": "9ee44012534850f8b9bccd150f728c6227821ea9",
"commit-date": "1341838460" "commit-date": "1341908518"
}, },
{ {
"package": "twig/twig", "package": "twig/twig",
......
...@@ -52,6 +52,7 @@ the ``Silex\Provider`` namespace: ...@@ -52,6 +52,7 @@ the ``Silex\Provider`` namespace:
* :doc:`DoctrineServiceProvider <providers/doctrine>` * :doc:`DoctrineServiceProvider <providers/doctrine>`
* :doc:`MonologServiceProvider <providers/monolog>` * :doc:`MonologServiceProvider <providers/monolog>`
* :doc:`SessionServiceProvider <providers/session>` * :doc:`SessionServiceProvider <providers/session>`
* :doc:`SerializerServiceProvider <providers/serializer>`
* :doc:`SwiftmailerServiceProvider <providers/swiftmailer>` * :doc:`SwiftmailerServiceProvider <providers/swiftmailer>`
* :doc:`TwigServiceProvider <providers/twig>` * :doc:`TwigServiceProvider <providers/twig>`
* :doc:`TranslationServiceProvider <providers/translation>` * :doc:`TranslationServiceProvider <providers/translation>`
......
SerializerServiceProvider
===========================
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>`_.
* **serializer.normalizers**: `Symfony\Component\Serializer\Normalizer\CustomNormalizer
<http://api.symfony.com/master/Symfony/Component/Serializer/Normalizer/CustomNormalizer>`_
and `Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
<http://api.symfony.com/master/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer>`_.
Registering
-----------
.. code-block:: php
$app->register(new Silex\Provider\SerializerServiceProvider());
Usage
-----
The ``SerializerServiceProvider`` provider provides a ``serializer`` service::
.. code-block:: 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) {
$app->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+");
<?php
/*
* This file is part of the Silex framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Silex\Provider;
use Silex\Application;
use Silex\ServiceProviderInterface;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\CustomNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
/**
* Symfony Serializer component Provider.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Marijn Huizendveld <marijn@pink-tie.com>
*/
class SerializerServiceProvider implements ServiceProviderInterface
{
/**
* {@inheritDoc}
*
* This method registers a serializer service. {@link http://api.symfony.com/master/Symfony/Component/Serializer/Serializer.html
* The service is provided by the Symfony Serializer component}.
*
* @param Silex\Application $app
*/
public function register(Application $app)
{
$app['serializer'] = $app->share(function () use ($app) {
return new Serializer($app['serializer.normalizers'], $app['serializer.encoders']);
});
$app['serializer.encoders'] = $app->share(function () {
return array(
new JsonEncoder(),
new XmlEncoder()
);
});
$app['serializer.normalizers'] = $app->share(function () {
return array(
new CustomNormalizer(),
new GetSetMethodNormalizer()
);
});
}
/**
* {@inheritDoc}
*
* This provider does not execute any code when booting.
*
* @param Silex\Application $app
*/
public function boot(Application $app)
{
}
}
<?php
/*
* This file is part of the Silex framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Silex\Tests\Provider;
use Silex\Application;
use Silex\Provider\SerializerServiceProvider;
/**
* SerializerServiceProvider test cases.
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class SerializerServiceProviderTest extends \PHPUnit_Framework_TestCase
{
public function testRegister()
{
$app = new Application();
$app->register(new SerializerServiceProvider);
$this->assertInstanceOf("Symfony\Component\Serializer\Serializer", $app['serializer']);
$this->assertTrue($app['serializer']->supportsEncoding('xml'));
$this->assertTrue($app['serializer']->supportsEncoding('json'));
$this->assertTrue($app['serializer']->supportsDecoding('xml'));
$this->assertTrue($app['serializer']->supportsDecoding('json'));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment