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\ContainerBuilder ;
2017-10-19 19:59:09 +01:00
use Symfony\Component\DependencyInjection\EnvVarProcessor ;
2016-10-22 17:25:15 +01:00
use Symfony\Component\DependencyInjection\EnvVarProcessorInterface ;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException ;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag ;
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 ) {
2017-10-08 14:44:15 +01:00
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 ) {
2018-06-30 07:39:51 +01:00
$processors [ $prefix ] = new Reference ( $id );
2017-10-08 14:44:15 +01:00
$types [ $prefix ] = self :: validateProvidedTypes ( $type , $class );
2016-10-22 17:25:15 +01:00
}
}
2017-10-19 19:59:09 +01:00
if ( $bag instanceof EnvPlaceholderParameterBag ) {
foreach ( EnvVarProcessor :: getProvidedTypes () as $prefix => $type ) {
if ( ! isset ( $types [ $prefix ])) {
$types [ $prefix ] = self :: validateProvidedTypes ( $type , EnvVarProcessor :: class );
}
2016-10-22 17:25:15 +01:00
}
2017-10-19 19:59:09 +01:00
$bag -> setProvidedTypes ( $types );
}
if ( $processors ) {
2018-06-30 07:39:51 +01:00
$container -> setAlias ( 'container.env_var_processors_locator' , ( string ) ServiceLocatorTagPass :: register ( $container , $processors ))
2017-09-17 10:49:41 +01:00
-> setPublic ( true )
2016-10-22 17:25:15 +01:00
;
}
}
private static function validateProvidedTypes ( $types , $class )
{
$types = explode ( '|' , $types );
foreach ( $types as $type ) {
2018-07-26 09:45:46 +01:00
if ( ! \in_array ( $type , self :: $allowedTypes )) {
2016-10-22 17:25:15 +01:00
throw new InvalidArgumentException ( sprintf ( 'Invalid type "%s" returned by "%s::getProvidedTypes()", expected one of "%s".' , $type , $class , implode ( '", "' , self :: $allowedTypes )));
}
}
return $types ;
}
}