2015-08-17 17:00:26 -07:00
< ? 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 Symfony\Component\DependencyInjection\Compiler ;
use Symfony\Component\DependencyInjection\ContainerBuilder ;
/**
* Removes unused service definitions from the container .
*
* @ author Johannes M . Schmitt < schmittjoh @ gmail . com >
*/
class RemoveUnusedDefinitionsPass implements RepeatablePassInterface
{
private $repeatedPass ;
/**
* { @ inheritdoc }
*/
public function setRepeatedPass ( RepeatedPass $repeatedPass )
{
$this -> repeatedPass = $repeatedPass ;
}
/**
* Processes the ContainerBuilder to remove unused definitions .
*/
public function process ( ContainerBuilder $container )
{
2018-11-23 12:29:20 +00:00
$graph = $container -> getCompiler () -> getServiceReferenceGraph ();
2015-08-17 17:00:26 -07:00
$hasChanged = false ;
foreach ( $container -> getDefinitions () as $id => $definition ) {
2018-11-23 12:29:20 +00:00
if ( $definition -> isPublic () || $definition -> isPrivate ()) {
2015-08-17 17:00:26 -07:00
continue ;
}
if ( $graph -> hasNode ( $id )) {
$edges = $graph -> getNode ( $id ) -> getInEdges ();
$referencingAliases = array ();
$sourceIds = array ();
foreach ( $edges as $edge ) {
2018-11-23 12:29:20 +00:00
if ( $edge -> isWeak ()) {
continue ;
}
2015-08-17 17:00:26 -07:00
$node = $edge -> getSourceNode ();
$sourceIds [] = $node -> getId ();
if ( $node -> isAlias ()) {
$referencingAliases [] = $node -> getValue ();
}
}
2018-11-23 12:29:20 +00:00
$isReferenced = ( \count ( array_unique ( $sourceIds )) - \count ( $referencingAliases )) > 0 ;
2015-08-17 17:00:26 -07:00
} else {
$referencingAliases = array ();
$isReferenced = false ;
}
2018-11-23 12:29:20 +00:00
if ( 1 === \count ( $referencingAliases ) && false === $isReferenced ) {
2015-08-17 17:00:26 -07:00
$container -> setDefinition (( string ) reset ( $referencingAliases ), $definition );
2018-11-23 12:29:20 +00:00
$definition -> setPublic ( ! $definition -> isPrivate ());
$definition -> setPrivate ( reset ( $referencingAliases ) -> isPrivate ());
2015-08-17 17:00:26 -07:00
$container -> removeDefinition ( $id );
2018-11-23 12:29:20 +00:00
$container -> log ( $this , sprintf ( 'Removed service "%s"; reason: replaces alias %s.' , $id , reset ( $referencingAliases )));
} elseif ( 0 === \count ( $referencingAliases ) && false === $isReferenced ) {
2015-08-17 17:00:26 -07:00
$container -> removeDefinition ( $id );
2018-11-23 12:29:20 +00:00
$container -> resolveEnvPlaceholders ( serialize ( $definition ));
$container -> log ( $this , sprintf ( 'Removed service "%s"; reason: unused.' , $id ));
2015-08-17 17:00:26 -07:00
$hasChanged = true ;
}
}
if ( $hasChanged ) {
$this -> repeatedPass -> setRepeat ();
}
}
}