eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Compiler\QueryTypePass::process PHP Метод

process() публичный Метод

public process ( ContainerBuilder $container )
$container Symfony\Component\DependencyInjection\ContainerBuilder
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('ezpublish.query_type.registry')) {
            return;
        }
        $queryTypes = [];
        $queryTypesClasses = [];
        // tagged query types
        $taggedServiceIds = $container->findTaggedServiceIds('ezpublish.query_type');
        foreach ($taggedServiceIds as $taggedServiceId => $tags) {
            $queryTypeDefinition = $container->getDefinition($taggedServiceId);
            $queryTypeClass = $container->getParameterBag()->resolveValue($queryTypeDefinition->getClass());
            $queryTypesClasses[$queryTypeClass] = [];
            for ($i = 0, $count = count($tags); $i < $count; ++$i) {
                $name = isset($tags[$i]['alias']) ? $tags[$i]['alias'] : $queryTypeClass::getName();
                $queryTypes[$name] = new Reference($taggedServiceId);
                $queryTypesClasses[$queryTypeClass][$name] = true;
            }
        }
        // named by convention query types
        if ($container->hasParameter('kernel.bundles')) {
            foreach ($container->getParameter('kernel.bundles') as $bundleName => $bundleClass) {
                $bundleReflectionClass = new ReflectionClass($bundleClass);
                $bundleDir = dirname($bundleReflectionClass->getFileName());
                $bundleQueryTypesDir = $bundleDir . DIRECTORY_SEPARATOR . 'QueryType';
                if (!is_dir($bundleQueryTypesDir)) {
                    continue;
                }
                $queryTypeServices = [];
                $bundleQueryTypeNamespace = substr($bundleClass, 0, strrpos($bundleClass, '\\') + 1) . 'QueryType';
                foreach (glob($bundleQueryTypesDir . DIRECTORY_SEPARATOR . '*QueryType.php') as $queryTypeFilePath) {
                    $queryTypeFileName = basename($queryTypeFilePath, '.php');
                    $queryTypeClassName = $bundleQueryTypeNamespace . '\\' . $queryTypeFileName;
                    if (!class_exists($queryTypeClassName)) {
                        throw new Exception("Expected {$queryTypeClassName} to be defined in {$queryTypeFilePath}");
                    }
                    $queryTypeName = $queryTypeClassName::getName();
                    // skip if the class was already registered as a tagged service with the same name
                    if (isset($queryTypesClasses[$queryTypeClassName][$queryTypeName])) {
                        continue;
                    }
                    $queryTypeReflectionClass = new ReflectionClass($queryTypeClassName);
                    if (!$queryTypeReflectionClass->implementsInterface('eZ\\Publish\\Core\\QueryType\\QueryType')) {
                        throw new Exception("{$queryTypeClassName} needs to implement eZ\\Publish\\Core\\QueryType\\QueryType");
                    }
                    $serviceId = 'ezpublish.query_type.convention.' . strtolower($bundleName) . '_' . strtolower($queryTypeFileName);
                    $queryTypeServices[$serviceId] = new Definition($queryTypeClassName);
                    $queryTypes[$queryTypeName] = new Reference($serviceId);
                }
                $container->addDefinitions($queryTypeServices);
            }
        }
        $aggregatorDefinition = $container->getDefinition('ezpublish.query_type.registry');
        $aggregatorDefinition->addMethodCall('addQueryTypes', [$queryTypes]);
    }
QueryTypePass