Skip to content

Commit

Permalink
Merge pull request #711 from schmittjoh/exp-function-provider-tag
Browse files Browse the repository at this point in the history
Allow to add expression function providers using DI tags
  • Loading branch information
goetas committed Dec 23, 2018
2 parents d6bae34 + a557bfe commit 3185c1f
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 7 deletions.
28 changes: 28 additions & 0 deletions DependencyInjection/Compiler/ExpressionFunctionProviderPass.php
@@ -0,0 +1,28 @@
<?php

namespace JMS\SerializerBundle\DependencyInjection\Compiler;

use Hateoas\Configuration\Provider\RelationProviderInterface;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;

class ExpressionFunctionProviderPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
try {
$registryDefinition = $container->findDefinition('jms_serializer.expression_language');

foreach (array_keys($container->findTaggedServiceIds('jms.expression.function_provider')) as $id) {
$registryDefinition->addMethodCall('registerProvider', [new Reference($id)]);
}
} catch (ServiceNotFoundException $exception){

}
}
}
2 changes: 2 additions & 0 deletions JMSSerializerBundle.php
Expand Up @@ -5,6 +5,7 @@
use JMS\DiExtraBundle\DependencyInjection\Compiler\LazyServiceMapPass;
use JMS\SerializerBundle\DependencyInjection\Compiler\CustomHandlersPass;
use JMS\SerializerBundle\DependencyInjection\Compiler\DoctrinePass;
use JMS\SerializerBundle\DependencyInjection\Compiler\ExpressionFunctionProviderPass;
use JMS\SerializerBundle\DependencyInjection\Compiler\FormErrorHandlerTranslationDomainPass;
use JMS\SerializerBundle\DependencyInjection\Compiler\RegisterEventListenersAndSubscribersPass;
use JMS\SerializerBundle\DependencyInjection\Compiler\ServiceMapPass;
Expand All @@ -31,6 +32,7 @@ function (ContainerBuilder $container, $def) {

$builder->addCompilerPass(new FormErrorHandlerTranslationDomainPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION);
$builder->addCompilerPass(new TwigExtensionPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION);
$builder->addCompilerPass(new ExpressionFunctionProviderPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION);
$builder->addCompilerPass(new RegisterEventListenersAndSubscribersPass(), PassConfig::TYPE_BEFORE_REMOVING);
$builder->addCompilerPass(new CustomHandlersPass(), PassConfig::TYPE_BEFORE_REMOVING);
$builder->addCompilerPass(new DoctrinePass(), PassConfig::TYPE_BEFORE_REMOVING);
Expand Down
9 changes: 4 additions & 5 deletions Resources/config/services.xml
Expand Up @@ -171,12 +171,11 @@
<argument type="service" key="container" id="service_container"/>
</argument>
</service>
<service id="jms_serializer.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" public="false">
<call method="registerProvider">
<argument type="service" id="jms_serializer.expression_language.function_provider" />
</call>
<service id="jms_serializer.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" public="false"/>

<service id="jms_serializer.expression_language.function_provider" class="JMS\SerializerBundle\ExpressionLanguage\BasicSerializerFunctionsProvider" public="false">
<tag name="jms.expression.function_provider"/>
</service>
<service id="jms_serializer.expression_language.function_provider" class="JMS\SerializerBundle\ExpressionLanguage\BasicSerializerFunctionsProvider" public="false"/>

<!-- Twig Extension -->
<service id="jms_serializer.twig_extension.serializer" class="JMS\Serializer\Twig\SerializerExtension" public="false">
Expand Down
Expand Up @@ -4,6 +4,9 @@

use JMS\Serializer\Annotation as Serializer;

/**
* @Serializer\VirtualProperty(exp="parameter('foo')", name="virtual")
*/
class ObjectUsingExpressionLanguage
{
/**
Expand Down
5 changes: 3 additions & 2 deletions Tests/DependencyInjection/JMSSerializerExtensionTest.php
Expand Up @@ -392,9 +392,9 @@ public function testExpressionLanguage()
$serializer = $container->get('jms_serializer');
// test that all components have been wired correctly
$object = new ObjectUsingExpressionLanguage('foo', true);
$this->assertEquals('{"name":"foo"}', $serializer->serialize($object, 'json'));
$this->assertEquals('{"virtual":"bar","name":"foo"}', $serializer->serialize($object, 'json'));
$object = new ObjectUsingExpressionLanguage('foo', false);
$this->assertEquals('{}', $serializer->serialize($object, 'json'));
$this->assertEquals('{"virtual":"bar"}', $serializer->serialize($object, 'json'));
}

public function testExpressionLanguageVirtualProperties()
Expand Down Expand Up @@ -530,6 +530,7 @@ private function getContainerForConfigLoad(array $configs, callable $configurato
$container->setParameter('kernel.debug', true);
$container->setParameter('kernel.cache_dir', sys_get_temp_dir() . '/serializer');
$container->setParameter('kernel.bundles', array());
$container->setParameter('foo', 'bar');
$container->set('annotation_reader', new AnnotationReader());
$container->setDefinition('doctrine', new Definition(Registry::class));
$container->set('translator', $this->getMockBuilder('Symfony\\Component\\Translation\\TranslatorInterface')->getMock());
Expand Down

0 comments on commit 3185c1f

Please sign in to comment.