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\Alias ;
2016-04-20 09:56:34 -07:00
use Symfony\Component\DependencyInjection\Definition ;
2015-08-17 17:00:26 -07:00
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException ;
use Symfony\Component\DependencyInjection\Reference ;
use Symfony\Component\DependencyInjection\ContainerBuilder ;
/**
* Replaces all references to aliases with references to the actual service .
*
* @ author Johannes M . Schmitt < schmittjoh @ gmail . com >
*/
class ResolveReferencesToAliasesPass implements CompilerPassInterface
{
private $container ;
/**
* Processes the ContainerBuilder to replace references to aliases with actual service references .
*
* @ param ContainerBuilder $container
*/
public function process ( ContainerBuilder $container )
{
$this -> container = $container ;
foreach ( $container -> getDefinitions () as $definition ) {
if ( $definition -> isSynthetic () || $definition -> isAbstract ()) {
continue ;
}
$definition -> setArguments ( $this -> processArguments ( $definition -> getArguments ()));
$definition -> setMethodCalls ( $this -> processArguments ( $definition -> getMethodCalls ()));
$definition -> setProperties ( $this -> processArguments ( $definition -> getProperties ()));
2016-04-20 09:56:34 -07:00
$definition -> setFactory ( $this -> processFactory ( $definition -> getFactory ()));
$definition -> setFactoryService ( $this -> processFactoryService ( $definition -> getFactoryService ( false )), false );
2015-08-17 17:00:26 -07:00
}
foreach ( $container -> getAliases () as $id => $alias ) {
$aliasId = ( string ) $alias ;
if ( $aliasId !== $defId = $this -> getDefinitionId ( $aliasId )) {
$container -> setAlias ( $id , new Alias ( $defId , $alias -> isPublic ()));
}
}
}
/**
* Processes the arguments to replace aliases .
*
* @ param array $arguments An array of References
*
* @ return array An array of References
*/
private function processArguments ( array $arguments )
{
foreach ( $arguments as $k => $argument ) {
if ( is_array ( $argument )) {
$arguments [ $k ] = $this -> processArguments ( $argument );
} elseif ( $argument instanceof Reference ) {
$defId = $this -> getDefinitionId ( $id = ( string ) $argument );
if ( $defId !== $id ) {
2016-04-20 09:56:34 -07:00
$arguments [ $k ] = new Reference ( $defId , $argument -> getInvalidBehavior (), $argument -> isStrict ( false ));
2015-08-17 17:00:26 -07:00
}
}
}
return $arguments ;
}
2016-04-20 09:56:34 -07:00
private function processFactoryService ( $factoryService )
{
if ( null === $factoryService ) {
return ;
}
return $this -> getDefinitionId ( $factoryService );
}
private function processFactory ( $factory )
{
if ( null === $factory || ! is_array ( $factory ) || ! $factory [ 0 ] instanceof Reference ) {
return $factory ;
}
$defId = $this -> getDefinitionId ( $id = ( string ) $factory [ 0 ]);
if ( $defId !== $id ) {
$factory [ 0 ] = new Reference ( $defId , $factory [ 0 ] -> getInvalidBehavior (), $factory [ 0 ] -> isStrict ( false ));
}
return $factory ;
}
2015-08-17 17:00:26 -07:00
/**
* Resolves an alias into a definition id .
*
* @ param string $id The definition or alias id to resolve
*
* @ return string The definition id with aliases resolved
*/
private function getDefinitionId ( $id )
{
$seen = array ();
while ( $this -> container -> hasAlias ( $id )) {
if ( isset ( $seen [ $id ])) {
throw new ServiceCircularReferenceException ( $id , array_keys ( $seen ));
}
$seen [ $id ] = true ;
$id = ( string ) $this -> container -> getAlias ( $id );
}
return $id ;
}
}