This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php

70 lines
1.9 KiB
PHP
Raw Normal View History

2010-12-29 19:12:24 +00:00
<?php
namespace Symfony\Component\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
/**
* Removes unused service definitions from the container
*
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
*/
class RemoveUnusedDefinitionsPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$hasChanged = false;
$aliases = $container->getAliases();
foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isPublic()) {
continue;
}
if (!in_array($id, $aliases, true) && !$this->isReferenced($container, $id)) {
$container->remove($id);
$hasChanged = true;
}
}
if ($hasChanged) {
$this->process($container);
}
}
protected function isReferenced(ContainerBuilder $container, $id)
{
foreach ($container->getDefinitions() as $definition) {
if ($this->isReferencedByArgument($id, $definition->getArguments())) {
return true;
}
foreach ($definition->getMethodCalls() as $arguments)
{
if ($this->isReferencedByArgument($id, $arguments)) {
return true;
}
}
}
return false;
}
protected function isReferencedByArgument($id, $argument)
{
if (is_array($argument)) {
foreach ($argument as $arg) {
if ($this->isReferencedByArgument($id, $arg)) {
return true;
}
}
} else if ($argument instanceof Reference) {
if ($id === (string) $argument) {
return true;
}
}
return false;
}
}