Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
Строк: 98
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentDependencyInjectionCompiler;

use 
SymfonyComponentDependencyInjectionExceptionServiceCircularReferenceException;
use 
SymfonyComponentDependencyInjectionContainerBuilder;

/**
 * Checks your services for circular references.
 *
 * References from method calls are ignored since we might be able to resolve
 * these references depending on the order in which services are called.
 *
 * Circular reference from method calls will only be detected at run-time.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CheckCircularReferencesPass implements CompilerPassInterface
{
    private 
$currentPath;
    private 
$checkedNodes;

    
/**
     * Checks the ContainerBuilder object for circular references.
     *
     * @param ContainerBuilder $container The ContainerBuilder instances
     */
    
public function process(ContainerBuilder $container)
    {
        
$graph $container->getCompiler()->getServiceReferenceGraph();

        
$this->checkedNodes = array();
        foreach (
$graph->getNodes() as $id => $node) {
            
$this->currentPath = array($id);

            
$this->checkOutEdges($node->getOutEdges());
        }
    }

    
/**
     * Checks for circular references.
     *
     * @param ServiceReferenceGraphEdge[] $edges An array of Edges
     *
     * @throws ServiceCircularReferenceException When a circular reference is found.
     */
    
private function checkOutEdges(array $edges)
    {
        foreach (
$edges as $edge) {
            
$node $edge->getDestNode();
            
$id $node->getId();

            if (empty(
$this->checkedNodes[$id])) {
                
$searchKey array_search($id$this->currentPath);
                
$this->currentPath[] = $id;

                if (
false !== $searchKey) {
                    throw new 
ServiceCircularReferenceException($idarray_slice($this->currentPath$searchKey));
                }

                
$this->checkOutEdges($node->getOutEdges());

                
$this->checkedNodes[$id] = true;
                
array_pop($this->currentPath);
            }
        }
    }
}
Онлайн: 1
Реклама