@@ -183,6 +183,8 @@ private function lexValue()
183183 throw $ this ->createFormatException ('Whitespace are not supported before the value ' );
184184 }
185185
186+ $ loadedVars = array_flip (explode (', ' , isset ($ _SERVER ['SYMFONY_DOTENV_VARS ' ]) ? $ _SERVER ['SYMFONY_DOTENV_VARS ' ] : (isset ($ _ENV ['SYMFONY_DOTENV_VARS ' ]) ? $ _ENV ['SYMFONY_DOTENV_VARS ' ] : '' )));
187+ unset($ loadedVars ['' ]);
186188 $ v = '' ;
187189
188190 do {
@@ -224,8 +226,8 @@ private function lexValue()
224226 ++$ this ->cursor ;
225227 $ value = str_replace (['\\" ' , '\r ' , '\n ' ], ['" ' , "\r" , "\n" ], $ value );
226228 $ resolvedValue = $ value ;
227- $ resolvedValue = $ this ->resolveVariables ($ resolvedValue );
228- $ resolvedValue = $ this ->resolveCommands ($ resolvedValue );
229+ $ resolvedValue = $ this ->resolveVariables ($ resolvedValue, $ loadedVars );
230+ $ resolvedValue = $ this ->resolveCommands ($ resolvedValue, $ loadedVars );
229231 $ resolvedValue = str_replace ('\\\\' , '\\' , $ resolvedValue );
230232 $ v .= $ resolvedValue ;
231233 } else {
@@ -247,8 +249,8 @@ private function lexValue()
247249 }
248250 $ value = rtrim ($ value );
249251 $ resolvedValue = $ value ;
250- $ resolvedValue = $ this ->resolveVariables ($ resolvedValue );
251- $ resolvedValue = $ this ->resolveCommands ($ resolvedValue );
252+ $ resolvedValue = $ this ->resolveVariables ($ resolvedValue, $ loadedVars );
253+ $ resolvedValue = $ this ->resolveCommands ($ resolvedValue, $ loadedVars );
252254 $ resolvedValue = str_replace ('\\\\' , '\\' , $ resolvedValue );
253255
254256 if ($ resolvedValue === $ value && preg_match ('/\s+/ ' , $ value )) {
@@ -301,7 +303,7 @@ private function skipEmptyLines()
301303 }
302304 }
303305
304- private function resolveCommands ($ value )
306+ private function resolveCommands ($ value, $ loadedVars )
305307 {
306308 if (false === strpos ($ value , '$ ' )) {
307309 return $ value ;
@@ -317,7 +319,7 @@ private function resolveCommands($value)
317319 )
318320 /x ' ;
319321
320- return preg_replace_callback ($ regex , function ($ matches ) {
322+ return preg_replace_callback ($ regex , function ($ matches ) use ( $ loadedVars ) {
321323 if ('\\' === $ matches [1 ]) {
322324 return substr ($ matches [0 ], 1 );
323325 }
@@ -332,7 +334,15 @@ private function resolveCommands($value)
332334
333335 $ process = new Process ('echo ' .$ matches [0 ]);
334336 $ process ->inheritEnvironmentVariables (true );
335- $ process ->setEnv ($ this ->values );
337+
338+ $ env = [];
339+ foreach ($ this ->values as $ name => $ value ) {
340+ if (isset ($ loadedVars [$ name ]) || (!isset ($ _ENV [$ name ]) && !(isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )))) {
341+ $ env [$ name ] = $ value ;
342+ }
343+ }
344+ $ process ->setEnv ($ env );
345+
336346 try {
337347 $ process ->mustRun ();
338348 } catch (ProcessException $ e ) {
@@ -343,7 +353,7 @@ private function resolveCommands($value)
343353 }, $ value );
344354 }
345355
346- private function resolveVariables ($ value )
356+ private function resolveVariables ($ value, array $ loadedVars )
347357 {
348358 if (false === strpos ($ value , '$ ' )) {
349359 return $ value ;
@@ -359,7 +369,7 @@ private function resolveVariables($value)
359369 (?P<closing_brace>\})? # optional closing brace
360370 /x ' ;
361371
362- $ value = preg_replace_callback ($ regex , function ($ matches ) {
372+ $ value = preg_replace_callback ($ regex , function ($ matches ) use ( $ loadedVars ) {
363373 // odd number of backslashes means the $ character is escaped
364374 if (1 === \strlen ($ matches ['backslashes ' ]) % 2 ) {
365375 return substr ($ matches [0 ], 1 );
@@ -375,14 +385,16 @@ private function resolveVariables($value)
375385 }
376386
377387 $ name = $ matches ['name ' ];
378- if (isset ($ this ->values [$ name ])) {
388+ if (isset ($ loadedVars [ $ name ]) && isset ( $ this ->values [$ name ])) {
379389 $ value = $ this ->values [$ name ];
380- } elseif (isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )) {
381- $ value = $ _SERVER [$ name ];
382390 } elseif (isset ($ _ENV [$ name ])) {
383391 $ value = $ _ENV [$ name ];
392+ } elseif (isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )) {
393+ $ value = $ _SERVER [$ name ];
394+ } elseif (isset ($ this ->values [$ name ])) {
395+ $ value = $ this ->values [$ name ];
384396 } else {
385- $ value = ( string ) getenv ( $ name ) ;
397+ $ value = '' ;
386398 }
387399
388400 if (!$ matches ['opening_brace ' ] && isset ($ matches ['closing_brace ' ])) {
0 commit comments