@@ -257,6 +257,8 @@ private function lexValue(): string
257257 throw $ this ->createFormatException ('Whitespace are not supported before the value ' );
258258 }
259259
260+ $ loadedVars = array_flip (explode (', ' , isset ($ _SERVER ['SYMFONY_DOTENV_VARS ' ]) ? $ _SERVER ['SYMFONY_DOTENV_VARS ' ] : (isset ($ _ENV ['SYMFONY_DOTENV_VARS ' ]) ? $ _ENV ['SYMFONY_DOTENV_VARS ' ] : '' )));
261+ unset($ loadedVars ['' ]);
260262 $ v = '' ;
261263
262264 do {
@@ -295,8 +297,8 @@ private function lexValue(): string
295297 ++$ this ->cursor ;
296298 $ value = str_replace (['\\" ' , '\r ' , '\n ' ], ['" ' , "\r" , "\n" ], $ value );
297299 $ resolvedValue = $ value ;
298- $ resolvedValue = $ this ->resolveVariables ($ resolvedValue );
299- $ resolvedValue = $ this ->resolveCommands ($ resolvedValue );
300+ $ resolvedValue = $ this ->resolveVariables ($ resolvedValue, $ loadedVars );
301+ $ resolvedValue = $ this ->resolveCommands ($ resolvedValue, $ loadedVars );
300302 $ resolvedValue = str_replace ('\\\\' , '\\' , $ resolvedValue );
301303 $ v .= $ resolvedValue ;
302304 } else {
@@ -318,8 +320,8 @@ private function lexValue(): string
318320 }
319321 $ value = rtrim ($ value );
320322 $ resolvedValue = $ value ;
321- $ resolvedValue = $ this ->resolveVariables ($ resolvedValue );
322- $ resolvedValue = $ this ->resolveCommands ($ resolvedValue );
323+ $ resolvedValue = $ this ->resolveVariables ($ resolvedValue, $ loadedVars );
324+ $ resolvedValue = $ this ->resolveCommands ($ resolvedValue, $ loadedVars );
323325 $ resolvedValue = str_replace ('\\\\' , '\\' , $ resolvedValue );
324326
325327 if ($ resolvedValue === $ value && preg_match ('/\s+/ ' , $ value )) {
@@ -372,7 +374,7 @@ private function skipEmptyLines()
372374 }
373375 }
374376
375- private function resolveCommands (string $ value ): string
377+ private function resolveCommands (string $ value, array $ loadedVars ): string
376378 {
377379 if (false === strpos ($ value , '$ ' )) {
378380 return $ value ;
@@ -388,7 +390,7 @@ private function resolveCommands(string $value): string
388390 )
389391 /x ' ;
390392
391- return preg_replace_callback ($ regex , function ($ matches ) {
393+ return preg_replace_callback ($ regex , function ($ matches ) use ( $ loadedVars ) {
392394 if ('\\' === $ matches [1 ]) {
393395 return substr ($ matches [0 ], 1 );
394396 }
@@ -408,7 +410,14 @@ private function resolveCommands(string $value): string
408410 $ process ->inheritEnvironmentVariables ();
409411 }
410412
411- $ process ->setEnv ($ this ->values );
413+ $ env = [];
414+ foreach ($ this ->values as $ name => $ value ) {
415+ if (isset ($ loadedVars [$ name ]) || (!isset ($ _ENV [$ name ]) && !(isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )))) {
416+ $ env [$ name ] = $ value ;
417+ }
418+ }
419+ $ process ->setEnv ($ env );
420+
412421 try {
413422 $ process ->mustRun ();
414423 } catch (ProcessException $ e ) {
@@ -419,7 +428,7 @@ private function resolveCommands(string $value): string
419428 }, $ value );
420429 }
421430
422- private function resolveVariables (string $ value ): string
431+ private function resolveVariables (string $ value, array $ loadedVars ): string
423432 {
424433 if (false === strpos ($ value , '$ ' )) {
425434 return $ value ;
@@ -436,7 +445,7 @@ private function resolveVariables(string $value): string
436445 (?P<closing_brace>\})? # optional closing brace
437446 /x ' ;
438447
439- $ value = preg_replace_callback ($ regex , function ($ matches ) {
448+ $ value = preg_replace_callback ($ regex , function ($ matches ) use ( $ loadedVars ) {
440449 // odd number of backslashes means the $ character is escaped
441450 if (1 === \strlen ($ matches ['backslashes ' ]) % 2 ) {
442451 return substr ($ matches [0 ], 1 );
@@ -452,14 +461,16 @@ private function resolveVariables(string $value): string
452461 }
453462
454463 $ name = $ matches ['name ' ];
455- if (isset ($ this ->values [$ name ])) {
464+ if (isset ($ loadedVars [ $ name ]) && isset ( $ this ->values [$ name ])) {
456465 $ value = $ this ->values [$ name ];
457- } elseif (isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )) {
458- $ value = $ _SERVER [$ name ];
459466 } elseif (isset ($ _ENV [$ name ])) {
460467 $ value = $ _ENV [$ name ];
468+ } elseif (isset ($ _SERVER [$ name ]) && 0 !== strpos ($ name , 'HTTP_ ' )) {
469+ $ value = $ _SERVER [$ name ];
470+ } elseif (isset ($ this ->values [$ name ])) {
471+ $ value = $ this ->values [$ name ];
461472 } else {
462- $ value = ( string ) getenv ( $ name ) ;
473+ $ value = '' ;
463474 }
464475
465476 if ('' === $ value && isset ($ matches ['default_value ' ])) {
0 commit comments