eZ\Bundle\EzPublishRestBundle\DependencyInjection\Compiler\OutputVisitorPass::process PHP Method

process() public method

public process ( ContainerBuilder $container )
$container Symfony\Component\DependencyInjection\ContainerBuilder
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('ezpublish_rest.output.visitor.dispatcher')) {
            return;
        }
        $definition = $container->getDefinition('ezpublish_rest.output.visitor.dispatcher');
        $visitors = [];
        foreach ($container->findTaggedServiceIds('ezpublish_rest.output.visitor') as $id => $attributes) {
            foreach ($attributes as $attribute) {
                $priority = isset($attribute['priority']) ? $attribute['priority'] : 0;
                if (!isset($attribute['regexps'])) {
                    throw new \LogicException('ezpublish_rest.output.visitor service tag needs a "regexps" attribute to identify the Accept header. None given.');
                }
                if (is_array($attribute['regexps'])) {
                    $regexps = $attribute['regexps'];
                } elseif (is_string($attribute['regexps'])) {
                    try {
                        $regexps = $container->getParameter($attribute['regexps']);
                    } catch (InvalidArgumentException $e) {
                        throw new \LogicException("The regexps attribute of the ezpublish_rest.output.visitor service tag can be a string matching a container parameter name. No parameter {$attribute['regexps']} could be found.");
                    }
                } else {
                    throw new \LogicException('ezpublish_rest.output.visitor service tag needs a "regexps" attribute, either as an array or a string. Invalid value.');
                }
                $visitors[$priority][] = ['regexps' => $regexps, 'reference' => new Reference($id)];
            }
        }
        // sort by priority and flatten
        krsort($visitors);
        $visitors = call_user_func_array('array_merge', $visitors);
        foreach ($visitors as $visitor) {
            foreach ($visitor['regexps'] as $regexp) {
                $definition->addMethodCall('addVisitor', [$regexp, $visitor['reference']]);
            }
        }
    }

Usage Example

 public function testProcess()
 {
     $regexp1 = array('(^.*/.*$)');
     $regexp2 = array('(^application/json$)');
     $stringDefinition = new Definition();
     $stringDefinition->addTag('ezpublish_rest.output.visitor', array('regexps' => 'ezpublish_rest.output.visitor.test1.regexps'));
     $arrayDefinition = new Definition();
     $arrayDefinition->addTag('ezpublish_rest.output.visitor', array('regexps' => array($regexp1)));
     $containerBuilder = new ContainerBuilder();
     $containerBuilder->addDefinitions(array('ezpublish_rest.output.visitor.dispatcher' => new Definition(), 'ezpublish_rest.output.visitor.test_string' => $stringDefinition, 'ezpublish_rest.output.visitor.test_array' => $arrayDefinition));
     $containerBuilder->setParameter('ezpublish_rest.output.visitor.test1.regexps', array($regexp2));
     $compilerPass = new OutputVisitorPass();
     $compilerPass->process($containerBuilder);
     $dispatcherMethodCalls = $containerBuilder->getDefinition('ezpublish_rest.output.visitor.dispatcher')->getMethodCalls();
     self::assertTrue(isset($dispatcherMethodCalls[0][0]));
     self::assertTrue(isset($dispatcherMethodCalls[0][1]));
     self::assertEquals('addVisitor', $dispatcherMethodCalls[0][0]);
     self::assertEquals('addVisitor', $dispatcherMethodCalls[1][0]);
     self::assertInstanceOf('Symfony\\Component\\DependencyInjection\\Reference', $dispatcherMethodCalls[0][1][1]);
     self::assertInstanceOf('Symfony\\Component\\DependencyInjection\\Reference', $dispatcherMethodCalls[1][1][1]);
     self::assertEquals('ezpublish_rest.output.visitor.test_string', $dispatcherMethodCalls[0][1][1]->__toString());
     self::assertEquals('ezpublish_rest.output.visitor.test_array', $dispatcherMethodCalls[1][1][1]->__toString());
 }
OutputVisitorPass