2016-10-22 17:25:15 +01: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\Argument\ServiceClosureArgument ;
use Symfony\Component\DependencyInjection\ContainerBuilder ;
use Symfony\Component\DependencyInjection\EnvVarProcessorInterface ;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException ;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag ;
use Symfony\Component\DependencyInjection\ServiceLocator ;
use Symfony\Component\DependencyInjection\Reference ;
/**
* Creates the container . env_var_processors_locator service .
*
* @ author Nicolas Grekas < p @ tchwork . com >
*/
class RegisterEnvVarProcessorsPass implements CompilerPassInterface
{
private static $allowedTypes = array ( 'array' , 'bool' , 'float' , 'int' , 'string' );
public function process ( ContainerBuilder $container )
{
$bag = $container -> getParameterBag ();
$types = array ();
$processors = array ();
foreach ( $container -> findTaggedServiceIds ( 'container.env_var_processor' ) as $id => $tags ) {
foreach ( $tags as $attr ) {
if ( ! $r = $container -> getReflectionClass ( $class = $container -> getDefinition ( $id ) -> getClass ())) {
throw new InvalidArgumentException ( sprintf ( 'Class "%s" used for service "%s" cannot be found.' , $class , $id ));
} elseif ( ! $r -> isSubclassOf ( EnvVarProcessorInterface :: class )) {
throw new InvalidArgumentException ( sprintf ( 'Service "%s" must implement interface "%s".' , $id , EnvVarProcessorInterface :: class ));
}
foreach ( $class :: getProvidedTypes () as $prefix => $type ) {
$processors [ $prefix ] = new ServiceClosureArgument ( new Reference ( $id ));
$types [ $prefix ] = self :: validateProvidedTypes ( $type , $class );
}
}
}
if ( $processors ) {
if ( $bag instanceof EnvPlaceholderParameterBag ) {
$bag -> setProvidedTypes ( $types );
}
$container -> register ( 'container.env_var_processors_locator' , ServiceLocator :: class )
2017-09-17 10:49:41 +01:00
-> setPublic ( true )
2016-10-22 17:25:15 +01:00
-> setArguments ( array ( $processors ))
;
}
}
private static function validateProvidedTypes ( $types , $class )
{
$types = explode ( '|' , $types );
foreach ( $types as $type ) {
if ( ! in_array ( $type , self :: $allowedTypes )) {
throw new InvalidArgumentException ( sprintf ( 'Invalid type "%s" returned by "%s::getProvidedTypes()", expected one of "%s".' , $type , $class , implode ( '", "' , self :: $allowedTypes )));
}
}
return $types ;
}
}