@@ -45,12 +45,14 @@ public function process(ContainerBuilder $container)
4545// this extension was not called
4646continue ;
4747 }
48- // EnvPlaceholderParameterBag tracks env vars when calling resolveValue().
49- // Clone so that tracking is done in a dedicated bag.
50- $ resolvingBag =clone $ container ->getParameterBag ();
48+ $ resolvingBag =$ container ->getParameterBag ();
49+ if ($ resolvingBaginstanceof EnvPlaceholderParameterBag &&$ extensioninstanceof Extension) {
50+ // create a dedicated bag so that we can track env vars per-extension
51+ $ resolvingBag =new MergeExtensionConfigurationParameterBag ($ resolvingBag );
52+ }
5153$ config =$ resolvingBag ->resolveValue ($ config );
5254
53- $ tmpContainer =new ContainerBuilder ($ container -> getParameterBag () );
55+ $ tmpContainer =new ContainerBuilder ($ resolvingBag );
5456$ tmpContainer ->setResourceTracking ($ container ->isTrackingResources ());
5557$ tmpContainer ->addObjectResource ($ extension );
5658if ($ extensioninstanceof ConfigurationExtensionInterface &&null !==$ configuration =$ extension ->getConfiguration ($ config ,$ tmpContainer )) {
@@ -63,13 +65,9 @@ public function process(ContainerBuilder $container)
6365
6466$ extension ->load ($ config ,$ tmpContainer );
6567
66- if ($ resolvingBaginstanceof EnvPlaceholderParameterBag) {
67- // $resolvingBag keeps track of env vars encoutered *before* merging configs
68- if ($ extensioninstanceof Extension) {
69- // but we don't want to keep track of env vars that are *overridden* when configs are merged
70- $ resolvingBag =new MergeExtensionConfigurationParameterBag ($ extension ,$ resolvingBag );
71- }
72- $ container ->getParameterBag ()->mergeEnvPlaceholders ($ resolvingBag );
68+ if ($ resolvingBaginstanceof MergeExtensionConfigurationParameterBag) {
69+ // don't keep track of env vars that are *overridden* when configs are merged
70+ $ resolvingBag ->freezeAfterProcessing ($ extension );
7371 }
7472
7573$ container ->merge ($ tmpContainer );
@@ -86,55 +84,41 @@ public function process(ContainerBuilder $container)
8684 */
8785class MergeExtensionConfigurationParameterBagextends EnvPlaceholderParameterBag
8886{
89- private $ beforeProcessingEnvPlaceholders ;
87+ private $ processedEnvPlaceholders ;
9088
91- public function __construct (Extension $ extension , parent $ resolvingBag )
89+ public function __construct (parent $ parameterBag )
9290 {
93- $ this ->beforeProcessingEnvPlaceholders =$ resolvingBag ->getEnvPlaceholders ();
94- $ config =$ this ->resolveEnvPlaceholders ($ extension ->getProcessedConfigs ());
95- parent ::__construct ($ this ->resolveValue ($ config ));
91+ parent ::__construct ($ parameterBag ->all ());
92+ $ this ->mergeEnvPlaceholders ($ parameterBag );
9693 }
9794
98- /**
99- * {@inheritdoc}
100- */
101- public function get ($ name )
95+ public function freezeAfterProcessing (Extension $ extension )
10296 {
103- return $ this ->has ($ name ) || (0 ===strpos ($ name ,'env( ' ) &&') ' ===substr ($ name , -1 ) &&'env() ' !==$ name ) ?parent ::get ($ name ) :'' ;
97+ $ this ->processedEnvPlaceholders =array ();
98+ $ this ->processMergedConfig ($ extension ->getProcessedConfigs (),parent ::getEnvPlaceholders ());
10499 }
105100
106101/**
107102 * {@inheritdoc}
108103 */
109104public function getEnvPlaceholders ()
110105 {
111- // contains the list of env vars that are still used after configs have been merged
112- $ envPlaceholders =parent ::getEnvPlaceholders ();
113-
114- foreach ($ envPlaceholdersas $ env =>$ placeholders ) {
115- if (isset ($ this ->beforeProcessingEnvPlaceholders [$ env ])) {
116- // for still-used env vars, keep track of their before-processing placeholders
117- $ envPlaceholders [$ env ] +=$ this ->beforeProcessingEnvPlaceholders [$ env ];
118- }
119- }
120-
121- return $ envPlaceholders ;
106+ return null !==$ this ->processedEnvPlaceholders ?$ this ->processedEnvPlaceholders :parent ::getEnvPlaceholders ();
122107 }
123108
124- /**
125- * Replaces-back env placeholders to their original "%env(FOO)%" version.
126- */
127- private function resolveEnvPlaceholders ($ value )
109+ private function processMergedConfig ($ value ,array $ envPlaceholders )
128110 {
129111if (is_array ($ value )) {
130112foreach ($ valueas $ k =>$ v ) {
131- $ value [$ this ->resolveEnvPlaceholders ($ k )] =$ this ->resolveEnvPlaceholders ($ v );
113+ $ this ->processMergedConfig ($ k ,$ envPlaceholders );
114+ $ this ->processMergedConfig ($ v ,$ envPlaceholders );
132115 }
133116 }elseif (is_string ($ value )) {
134- foreach ($ this -> beforeProcessingEnvPlaceholders as $ env =>$ placeholders ) {
117+ foreach ($ envPlaceholders as $ env =>$ placeholders ) {
135118foreach ($ placeholdersas $ placeholder ) {
136119if (false !==stripos ($ value ,$ placeholder )) {
137- $ value =str_ireplace ($ placeholder ,"%env( $ env)% " ,$ value );
120+ $ this ->processedEnvPlaceholders [$ env ] =$ placeholders ;
121+ break ;
138122 }
139123 }
140124 }