diff --git a/DependencyInjection/SerializerCompilerPass.php b/DependencyInjection/SerializerCompilerPass.php new file mode 100644 index 00000000..71513a6f --- /dev/null +++ b/DependencyInjection/SerializerCompilerPass.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FOS\JsRoutingBundle\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** + * Class SerializerCompilerPass + * + * @author Miguel Angel Garzón + */ +class SerializerCompilerPass implements CompilerPassInterface +{ + /** + * @inheritdoc + * @param ContainerBuilder $container + */ + public function process(ContainerBuilder $container) + { + if ($container->hasDefinition('fos_js_routing.serializer') + || $container->hasAlias('fos_js_routing.serializer')) { + return; + } + + if ($container->hasDefinition('serializer')) { + $container->setAlias('fos_js_routing.serializer', 'serializer'); + } else { + $definition = $container->register('fos_js_routing.serializer', 'Symfony\Component\Serializer\Serializer'); + $normalizers = array( + $container->getDefinition('fos_js_routing.normalizer.route_collection'), + $container->getDefinition('fos_js_routing.normalizer.routes_response'), + $container->getDefinition('fos_js_routing.denormalizer.route_collection') + ); + $definition->addArgument($normalizers); + + $encoder = $container->register('fos_js_routing.encoder', 'Symfony\Component\Serializer\Encoder\JsonEncoder'); + $encoder->setPublic(false); + $definition->addArgument(array('json' => $encoder)); + } + } +} diff --git a/FOSJsRoutingBundle.php b/FOSJsRoutingBundle.php index 2f2ca320..5aa7ecb9 100644 --- a/FOSJsRoutingBundle.php +++ b/FOSJsRoutingBundle.php @@ -11,6 +11,8 @@ namespace FOS\JsRoutingBundle; +use FOS\JsRoutingBundle\DependencyInjection\SerializerCompilerPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; /** @@ -20,4 +22,12 @@ */ class FOSJsRoutingBundle extends Bundle { + /** + * @param ContainerBuilder $container + */ + public function build(ContainerBuilder $container) + { + parent::build($container); + $container->addCompilerPass(new SerializerCompilerPass()); + } } diff --git a/Resources/config/serializer.xml b/Resources/config/serializer.xml index 8b749eaa..0e288cf3 100644 --- a/Resources/config/serializer.xml +++ b/Resources/config/serializer.xml @@ -11,22 +11,15 @@ - - - - - - - - - + + + + + - - - - - - + + + diff --git a/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php b/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php index 7be59dc9..d2188b03 100644 --- a/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php +++ b/Tests/DependencyInjection/FOSJsRoutingExtensionTest.php @@ -12,6 +12,7 @@ namespace FOS\JsRoutingBundle\Tests\DependencyInjection; use FOS\JsRoutingBundle\DependencyInjection\FOSJsRoutingExtension; +use FOS\JsRoutingBundle\DependencyInjection\SerializerCompilerPass; use Symfony\Component\DependencyInjection\ContainerBuilder; class FOSJsRoutingExtensionTest extends \PHPUnit_Framework_TestCase @@ -60,6 +61,9 @@ private function load(array $configs) $extension = new FOSJsRoutingExtension(); $extension->load($configs, $container); + $compilerPass = new SerializerCompilerPass(); + $compilerPass->process($container); + return $container; } } diff --git a/Tests/DependencyInjection/SerializerCompilerPassTest.php b/Tests/DependencyInjection/SerializerCompilerPassTest.php new file mode 100644 index 00000000..9fbd39f4 --- /dev/null +++ b/Tests/DependencyInjection/SerializerCompilerPassTest.php @@ -0,0 +1,63 @@ + + */ +class SerializerCompilerPassTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + if (!class_exists('Symfony\Component\DependencyInjection\ContainerBuilder')) { + $this->markTestSkipped('The DependencyInjection component is not available.'); + } + } + + public function testSerializerInConfig() + { + $container = $this->load(array(array('serializer' => 'test.serializer.service'))); + + $compilerPass = new SerializerCompilerPass(); + $compilerPass->process($container); + + $this->assertTrue($container->hasAlias('fos_js_routing.serializer')); + } + + public function testSerializerDefined() + { + $container = $this->load(array()); + + $container->register('serializer', 'Symfony\Component\Serializer\Serializer'); + + $compilerPass = new SerializerCompilerPass(); + $compilerPass->process($container); + + $this->assertTrue($container->hasAlias('fos_js_routing.serializer')); + } + + public function testSerializerNotDefined() + { + $container = $this->load(array()); + + $compilerPass = new SerializerCompilerPass(); + $compilerPass->process($container); + + $this->assertTrue($container->hasDefinition('fos_js_routing.serializer')); + } + + private function load(array $configs) + { + $container = new ContainerBuilder(); + + $extension = new FOSJsRoutingExtension(); + $extension->load($configs, $container); + + return $container; + } +}