eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Compiler\ConfigResolverParameterPass::process PHP Method

process() public method

public process ( ContainerBuilder $container )
$container Symfony\Component\DependencyInjection\ContainerBuilder
    public function process(ContainerBuilder $container)
    {
        $dynamicSettingsServices = array();
        $resettableServices = array();
        $updateableServices = $container->getParameter('ezpublish.config_resolver.updateable_services');
        // Pass #1 Loop against all arguments of all service definitions to replace dynamic settings by the fake service.
        foreach ($container->getDefinitions() as $serviceId => $definition) {
            // Constructor injection
            $replaceArguments = array();
            foreach ($definition->getArguments() as $i => $arg) {
                if (!$this->dynamicSettingParser->isDynamicSetting($arg)) {
                    continue;
                }
                // Decorators use index_X for their key
                if (strpos($i, 'index') === 0) {
                    $i = (int) substr($i, strlen('index_'));
                }
                $replaceArguments[$i] = $this->createExpression($this->dynamicSettingParser->parseDynamicSetting($arg));
            }
            if (!empty($replaceArguments)) {
                $dynamicSettingsServices[$serviceId] = true;
                foreach ($replaceArguments as $i => $arg) {
                    $definition->replaceArgument($i, $arg);
                }
            }
            // Setter injection
            $methodCalls = $definition->getMethodCalls();
            foreach ($methodCalls as $i => &$call) {
                list($method, $callArgs) = $call;
                $callHasDynamicSetting = false;
                foreach ($callArgs as &$callArg) {
                    if (!$this->dynamicSettingParser->isDynamicSetting($callArg)) {
                        continue;
                    }
                    $callArg = $this->createExpression($this->dynamicSettingParser->parseDynamicSetting($callArg));
                    $callHasDynamicSetting = true;
                }
                $call = array($method, $callArgs);
                if ($callHasDynamicSetting) {
                    // We only support single dynamic setting injection for updatable services.
                    if (count($callArgs) == 1) {
                        $updateableServices[$serviceId][] = [$method, (string) $callArgs[0]];
                    } else {
                        // Method call has more than 1 argument, so we will reset it instead of updating it.
                        $dynamicSettingsServices[$serviceId] = true;
                        // Ensure current service is not registered as updatable service.
                        unset($updateableServices[$serviceId]);
                    }
                }
            }
            $definition->setMethodCalls($methodCalls);
        }
        // Pass #2 Loop again, to get all services depending on dynamic settings services.
        foreach ($container->getDefinitions() as $id => $definition) {
            $isDependent = false;
            foreach ($definition->getArguments() as $arg) {
                if (!($arg instanceof Reference && isset($dynamicSettingsServices[(string) $arg]))) {
                    continue;
                }
                $isDependent = true;
                break;
            }
            if ($isDependent) {
                $resettableServices[] = $id;
            }
        }
        $resettableServices = array_unique(array_merge(array_keys($dynamicSettingsServices), $resettableServices));
        $container->setParameter('ezpublish.config_resolver.resettable_services', $resettableServices);
        $container->setParameter('ezpublish.config_resolver.updateable_services', $updateableServices);
    }

Usage Example

 public function testProcess()
 {
     $container = new ContainerBuilder();
     $container->setParameter('ezpublish.config_resolver.updateable_services', array());
     $updateableServices = array();
     $def1Arg1 = 'foo';
     $def1Arg2 = new Reference('foo.bar');
     $def1 = new Definition('stdClass', array($def1Arg1, $def1Arg2));
     $def2 = new Definition('stdClass', array('$bar;some_namespace$', array()));
     $def3 = new Definition('stdClass', array('$content.default_ttl;ezsettings;ezdemo_site_admin$'));
     $def4 = new Definition('stdClass', array('$languages$'));
     $def5Arg1 = new Reference('def3');
     $def5 = new Definition('stdClass', array($def5Arg1));
     $def6Arg1 = new Reference('def1');
     $def6Arg2 = new Reference('def4');
     $def6 = new Definition('stdClass', array($def6Arg1, $def6Arg2));
     $def7MethodCalls = array(array('setFoo', array('something', new Reference('def1'))), array('setBar', array(array('baz'))));
     $def7 = new Definition('stdClass');
     $def7->setMethodCalls($def7MethodCalls);
     $def8MethodCalls = array(array('setFoo', array('$foo$')), array('setBar', array('$bar;baz$')));
     $def8 = new Definition('stdClass');
     $def8->setMethodCalls($def8MethodCalls);
     $container->setDefinitions(array('def1' => $def1, 'def2' => $def2, 'def3' => $def3, 'def4' => $def4, 'def5' => $def5, 'def6' => $def6, 'def7' => $def7, 'def8' => $def8));
     $configResolverPass = new ConfigResolverParameterPass(new DynamicSettingParser());
     $configResolverPass->process($container);
     // Ensure that non concerned services stayed untouched.
     self::assertSame($def1Arg1, $def1->getArgument(0));
     self::assertSame($def1Arg2, $def1->getArgument(1));
     self::assertSame($def1, $container->getDefinition('def1'));
     self::assertSame($def5Arg1, $def5->getArgument(0));
     self::assertSame($def5, $container->getDefinition('def5'));
     self::assertSame($def6Arg1, $def6->getArgument(0));
     self::assertSame($def6Arg2, $def6->getArgument(1));
     self::assertSame($def6, $container->getDefinition('def6'));
     self::assertSame($def7MethodCalls, $def7->getMethodCalls());
     self::assertSame($def7, $container->getDefinition('def7'));
     // Check that concerned services arguments have been correctly transformed.
     $def2arg1 = $def2->getArgument(0);
     self::assertInstanceOf('Symfony\\Component\\ExpressionLanguage\\Expression', $def2arg1);
     self::assertSame('service("ezpublish.config.resolver").getParameter("bar", "some_namespace", null)', (string) $def2arg1);
     // Also check 2nd argument
     self::assertSame(array(), $def2->getArgument(1));
     $def3arg1 = $def3->getArgument(0);
     self::assertInstanceOf('Symfony\\Component\\ExpressionLanguage\\Expression', $def3arg1);
     self::assertSame('service("ezpublish.config.resolver").getParameter("content.default_ttl", "ezsettings", "ezdemo_site_admin")', (string) $def3arg1);
     $def4arg1 = $def4->getArgument(0);
     self::assertInstanceOf('Symfony\\Component\\ExpressionLanguage\\Expression', $def4arg1);
     self::assertSame('service("ezpublish.config.resolver").getParameter("languages", null, null)', (string) $def4arg1);
     $def8Calls = $def8->getMethodCalls();
     self::assertSame(count($def8MethodCalls), count($def8Calls));
     self::assertSame($def8MethodCalls[0][0], $def8Calls[0][0]);
     self::assertInstanceOf('Symfony\\Component\\ExpressionLanguage\\Expression', $def8Calls[0][1][0]);
     $exprSetFoo = 'service("ezpublish.config.resolver").getParameter("foo", null, null)';
     self::assertSame($exprSetFoo, (string) $def8Calls[0][1][0]);
     self::assertSame($def8MethodCalls[1][0], $def8Calls[1][0]);
     self::assertInstanceOf('Symfony\\Component\\ExpressionLanguage\\Expression', $def8Calls[1][1][0]);
     $exprSetBar = 'service("ezpublish.config.resolver").getParameter("bar", "baz", null)';
     self::assertSame($exprSetBar, (string) $def8Calls[1][1][0]);
     $updateableServices['def8'] = array(array('setFoo', $exprSetFoo), array('setBar', $exprSetBar));
     self::assertTrue($container->hasParameter('ezpublish.config_resolver.resettable_services'));
     self::assertEquals(array('def2', 'def3', 'def4', 'def5', 'def6'), $container->getParameter('ezpublish.config_resolver.resettable_services'));
     self::assertEquals($updateableServices, $container->getParameter('ezpublish.config_resolver.updateable_services'));
 }
All Usage Examples Of eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Compiler\ConfigResolverParameterPass::process