Removes unused service definitions from the container.
@author Johannes M. Schmitt <schmittjoh@gmail.com>
Expanded class hierarchy of RemoveUnusedDefinitionsPass
class RemoveUnusedDefinitionsPass implements RepeatablePassInterface {
private $repeatedPass;
/**
* {@inheritDoc}
*/
public function setRepeatedPass(RepeatedPass $repeatedPass) {
$this->repeatedPass = $repeatedPass;
}
/**
* Processes the ContainerBuilder to remove unused definitions.
*
* @param ContainerBuilder $container
*/
public function process(ContainerBuilder $container) {
$compiler = $container
->getCompiler();
$formatter = $compiler
->getLoggingFormatter();
$graph = $compiler
->getServiceReferenceGraph();
$hasChanged = false;
foreach ($container
->getDefinitions() as $id => $definition) {
if ($definition
->isPublic()) {
continue;
}
if ($graph
->hasNode($id)) {
$edges = $graph
->getNode($id)
->getInEdges();
$referencingAliases = array();
$sourceIds = array();
foreach ($edges as $edge) {
$node = $edge
->getSourceNode();
$sourceIds[] = $node
->getId();
if ($node
->isAlias()) {
$referencingAliases[] = $node
->getValue();
}
}
$isReferenced = count(array_unique($sourceIds)) - count($referencingAliases) > 0;
}
else {
$referencingAliases = array();
$isReferenced = false;
}
if (1 === count($referencingAliases) && false === $isReferenced) {
$container
->setDefinition((string) reset($referencingAliases), $definition);
$definition
->setPublic(true);
$container
->removeDefinition($id);
$compiler
->addLogMessage($formatter
->formatRemoveService($this, $id, 'replaces alias ' . reset($referencingAliases)));
}
elseif (0 === count($referencingAliases) && false === $isReferenced) {
$container
->removeDefinition($id);
$compiler
->addLogMessage($formatter
->formatRemoveService($this, $id, 'unused'));
$hasChanged = true;
}
}
if ($hasChanged) {
$this->repeatedPass
->setRepeat();
}
}
}
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
RemoveUnusedDefinitionsPass:: |
private | property | ||
RemoveUnusedDefinitionsPass:: |
public | function |
Processes the ContainerBuilder to remove unused definitions. Overrides CompilerPassInterface:: |
|
RemoveUnusedDefinitionsPass:: |
public | function |
Sets the RepeatedPass interface. Overrides RepeatablePassInterface:: |