{"tag":"environment variables","articles":{"projects\/avris-dotenv":{"key":"projects\/avris-dotenv","type":"article","published":true,"meta":{"createdAt":"2017-12-31T14:35:44+01:00","publishedAt":"2017-12-31T14:34:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Dotenv","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-dotenv"},"content":{"en":{"slug":"avris-dotenv","title":"Avris Dotenv","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_small.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHnElEQVRIiX2X268lRRXGf+tS1b33OXufM2dmzjDchpsooo4QjSTEgCQIxKBB4wVNiD7og8YH\/wTfffPBaHzWJ+MLYqLRCCSQKBqVi0i4zADDQIaZOZd9bru7avnQewajxkpXdyddl6++r1atr+Xa626NKBUhiFohKuZOLYUgUBFcDVMluTOfH1BrhQiIQAARQRiKiCAiQHCpRMSi1stPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjEBIot2XG4vAiCoynuTy6V3IWpB1Ih4r58hJDW0FvxSB0EJKhGgIYgOkxGCqgNCXyqGoAghiqku2BgWggzfFtfiZrgb83mHCEQMCxRRdNHXVHEzkioeolDLguCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1y1KpCFErQbCyusrGhYtAhRDEIWpBVSDATElmJL8ESAAVqAu2BER0IYOhKGZGtsS4aSB6dvf2aNxpkpM9UWullJ6+FBCG\/VIrAMePrXOwPQPqQFoEqnkBSjEdJM6muGgiokPCQCp6eZMKajZQawkVRcVQcZaaJQ6NVrg420RDiRI0nlDPEIUQoe+7gSGBE9dey9unXkckkABTQQggIRILyZRkimvK9MEiYuxSrIDqwI4apkZ2J1tCMUQSTU5cf3SZnd0ZB13HsSvWme\/tMtvaxkTIrtSo3Pnpu3jlhReZ5oYghsgCVAdRVEEEkinZDQ9NSFrIhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YW1thc9\/\/YusHVrlD7\/4NW+cfgNrlkk+RNNkZZk777mL5x9\/itV2BBQiYgCjggqYCaYDa+6Ckxukd2qNhb4Aiqih5ogYbo5qws0WNXH3A5\/k4e98mZee+QeP\/vDnJAo3H7+SqJXtnRmeja99\/3s888vHuHo6ZV46avRElEE6XURXGvZQToopuLRL1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M43vv0F7nvobmYXt3nsx4+SdcShccuNN13Jzua7bO7uc893v0pSoZ5+kw8cX2e2t8t+P6fUnlI70Epyw0xwV5ILKRku4yky76FUAoY9giKSUDHEE1mdNiXGKfHwI\/dy30N3A\/D3J58j0TBZnrA8bti+sMeJj32ETz94J942PP2Dn7J+ZAWNjs2toO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JU6evJ7PfulTl1PC1jszDh87ylUn1jlx6zVcc\/sNLB2ZEhG88ZsnWBplSl2mbXpyU0EqNTr6fk7UDjVQDcyN3DieBGeyAn0hQgYwMUSX4bgmFEcWB+Aj33rg8skMcP837+U\/S0Rw5ok\/Mz\/3LkevO8zBZqbb2WCqHWIVsaDWjtofIPSoCeZKyhlvGlwnE1JhyDMoHkrCyOLkMLIaGeX2k9dy1VVr\/wXg30sthVd++ye2X3qFdklpV8YcveVq+s0lts4KKnOEDiQTJSFShwhLjuWMNSN8sjqhFGDBkCF4OK0YLUqL0VThjk\/c9H\/BzM5t8sKvnmJ+\/hyjBlDo9nbZPd\/hMme80lC7Mpw9BioJWcil7lhu0WaEX7E2ou+DWqCGoqEoRgohYbShNEW4+YYj\/xPI3tYu\/3zyOc785UWydIzaOqSOCtFBPTBolDxSIikmsZApoaZYymhukNRAHuEfWm\/Y3e+YHxTmfaWUSqkVCUGiYkUwEY4cGl8GsTPb4\/RLZzj1t1c58\/xrNNEx9kKkglPJWgkNsID5kCslBckDN8FM0JSQ3EIyyBlyA97iDx56i539ymzWsbVTmfXB9gHszmG\/g3kvlB5+8qOfsbezx8a7W+xc2CKXQqKQqLRaGVnPUgqmbWU+rjAJUgitDTZDSod6YNmwGnSdYUzoDgxtE5sXx3S0yN23Holpm9jfH6ySWybEqTghiYJTNdNXCFFQx8y5Yv0YF86fJ7szypn1I6vsb2\/RSM8kw9Gl4PihwvoRY2lJeP3sBrO9PUruWL3yKh7\/3R85dfaAaVtZX59w0AVPv7CDLK+uhaaMqGEp4U2LqOG5wVPGUoOqkZsW80TyzOG1NW7\/6G200bG5tcfx9XXWpsucOfUmy9lZTsaF106x2sLhZeXQEiTtSdazutRz88kxG2dnnDu7xWQELj1H77iX3Wd\/j9\/yua\/QLE\/pK7RLEzw1qDpiTvKEiCEMeUdCkFJpTFg6ts7Ozj7j5cosgjo3YmWdjf0DRtMpB5OOAxd2kpKT0aZKtcp+U+lslbX3w8bsVdJIaLynv7jL8gfvwwvGbHcPLDHf3kZkB9DBC8VgwAcvBFIqlIrUyhsvvwS1kM2QEkgEVgsJ49laGKfMJDkTd1aaxDgJroVxhtl+x8c\/POXNi0q90DMdwWTjLd53\/234xdMvM+861DO1VLwZwXv\/EAjgKaGqSARRA40BgNaK9P1lg1+7A1yMjXdep80tLsLK8pTD01U8Kru7WxyaTvjri87bp0e8s7nPqfP7jHLQ6JzP9G8iR268JWop9PM5tTsgLU2QEMp8H03NkA5qj+cWYPDcgNZAESQueejBi2sEQsVEcBVcQKlkM1SDvu8QCusTZ6U1LuwNNrdxuOME\/AvjxTpTHhTrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dotenv_small.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHnElEQVRIiX2X268lRRXGf+tS1b33OXufM2dmzjDchpsooo4QjSTEgCQIxKBB4wVNiD7og8YH\/wTfffPBaHzWJ+MLYqLRCCSQKBqVi0i4zADDQIaZOZd9bru7avnQewajxkpXdyddl6++r1atr+Xa626NKBUhiFohKuZOLYUgUBFcDVMluTOfH1BrhQiIQAARQRiKiCAiQHCpRMSi1stPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjEBIot2XG4vAiCoynuTy6V3IWpB1Ih4r58hJDW0FvxSB0EJKhGgIYgOkxGCqgNCXyqGoAghiqku2BgWggzfFtfiZrgb83mHCEQMCxRRdNHXVHEzkioeolDLguCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1y1KpCFErQbCyusrGhYtAhRDEIWpBVSDATElmJL8ESAAVqAu2BER0IYOhKGZGtsS4aSB6dvf2aNxpkpM9UWullJ6+FBCG\/VIrAMePrXOwPQPqQFoEqnkBSjEdJM6muGgiokPCQCp6eZMKajZQawkVRcVQcZaaJQ6NVrg420RDiRI0nlDPEIUQoe+7gSGBE9dey9unXkckkABTQQggIRILyZRkimvK9MEiYuxSrIDqwI4apkZ2J1tCMUQSTU5cf3SZnd0ZB13HsSvWme\/tMtvaxkTIrtSo3Pnpu3jlhReZ5oYghsgCVAdRVEEEkinZDQ9NSFrIhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YW1thc9\/\/YusHVrlD7\/4NW+cfgNrlkk+RNNkZZk777mL5x9\/itV2BBQiYgCjggqYCaYDa+6Ckxukd2qNhb4Aiqih5ogYbo5qws0WNXH3A5\/k4e98mZee+QeP\/vDnJAo3H7+SqJXtnRmeja99\/3s888vHuHo6ZV46avRElEE6XURXGvZQToopuLRL1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M43vv0F7nvobmYXt3nsx4+SdcShccuNN13Jzua7bO7uc893v0pSoZ5+kw8cX2e2t8t+P6fUnlI70Epyw0xwV5ILKRku4yky76FUAoY9giKSUDHEE1mdNiXGKfHwI\/dy30N3A\/D3J58j0TBZnrA8bti+sMeJj32ETz94J942PP2Dn7J+ZAWNjs2toO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JU6evJ7PfulTl1PC1jszDh87ylUn1jlx6zVcc\/sNLB2ZEhG88ZsnWBplSl2mbXpyU0EqNTr6fk7UDjVQDcyN3DieBGeyAn0hQgYwMUSX4bgmFEcWB+Aj33rg8skMcP837+U\/S0Rw5ok\/Mz\/3LkevO8zBZqbb2WCqHWIVsaDWjtofIPSoCeZKyhlvGlwnE1JhyDMoHkrCyOLkMLIaGeX2k9dy1VVr\/wXg30sthVd++ye2X3qFdklpV8YcveVq+s0lts4KKnOEDiQTJSFShwhLjuWMNSN8sjqhFGDBkCF4OK0YLUqL0VThjk\/c9H\/BzM5t8sKvnmJ+\/hyjBlDo9nbZPd\/hMme80lC7Mpw9BioJWcil7lhu0WaEX7E2ou+DWqCGoqEoRgohYbShNEW4+YYj\/xPI3tYu\/3zyOc785UWydIzaOqSOCtFBPTBolDxSIikmsZApoaZYymhukNRAHuEfWm\/Y3e+YHxTmfaWUSqkVCUGiYkUwEY4cGl8GsTPb4\/RLZzj1t1c58\/xrNNEx9kKkglPJWgkNsID5kCslBckDN8FM0JSQ3EIyyBlyA97iDx56i539ymzWsbVTmfXB9gHszmG\/g3kvlB5+8qOfsbezx8a7W+xc2CKXQqKQqLRaGVnPUgqmbWU+rjAJUgitDTZDSod6YNmwGnSdYUzoDgxtE5sXx3S0yN23Holpm9jfH6ySWybEqTghiYJTNdNXCFFQx8y5Yv0YF86fJ7szypn1I6vsb2\/RSM8kw9Gl4PihwvoRY2lJeP3sBrO9PUruWL3yKh7\/3R85dfaAaVtZX59w0AVPv7CDLK+uhaaMqGEp4U2LqOG5wVPGUoOqkZsW80TyzOG1NW7\/6G200bG5tcfx9XXWpsucOfUmy9lZTsaF106x2sLhZeXQEiTtSdazutRz88kxG2dnnDu7xWQELj1H77iX3Wd\/j9\/yua\/QLE\/pK7RLEzw1qDpiTvKEiCEMeUdCkFJpTFg6ts7Ozj7j5cosgjo3YmWdjf0DRtMpB5OOAxd2kpKT0aZKtcp+U+lslbX3w8bsVdJIaLynv7jL8gfvwwvGbHcPLDHf3kZkB9DBC8VgwAcvBFIqlIrUyhsvvwS1kM2QEkgEVgsJ49laGKfMJDkTd1aaxDgJroVxhtl+x8c\/POXNi0q90DMdwWTjLd53\/234xdMvM+861DO1VLwZwXv\/EAjgKaGqSARRA40BgNaK9P1lg1+7A1yMjXdep80tLsLK8pTD01U8Kru7WxyaTvjri87bp0e8s7nPqfP7jHLQ6JzP9G8iR268JWop9PM5tTsgLU2QEMp8H03NkA5qj+cWYPDcgNZAESQueejBi2sEQsVEcBVcQKlkM1SDvu8QCusTZ6U1LuwNNrdxuOME\/AvjxTpTHhTrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/dotenv\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003E.env\u003C\/h3\u003E\n\u003Cp\u003EEnvironmental variables are a great way to adjust your application to a specific environment,\nespecially when it comes to sensitive data, like database password.\u003C\/p\u003E\n\u003Cp\u003EThose variables should be set by your HTTP server,\nbut for local development having a \u003Ccode\u003E.env\u003C\/code\u003E file is way simpler:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EAPP_ENV=prod\nAPP_DEBUG=0\n\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\nDB_PASS=pass\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll you need to do in your front controller is load this file using Dotenv:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;load(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/..\/.env\u0027\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ENow all the variables from the file will be available via \u003Ccode\u003Egetenv\u003C\/code\u003E, \u003Ccode\u003E$_ENV\u003C\/code\u003E and \u003Ccode\u003E$_SERVER\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EAdvanced\u003C\/h3\u003E\n\u003Cp\u003EIf your variable value contains a space, remember to quote it:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EFOO=\u0026quot;Lorem ipsum\u0026quot;\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can add a comment if you start a line with a \u003Ccode\u003E#\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003E# comment\nFOO=bar\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can use vars inside other vars (escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EVAR1=osiem\nVAR2=\u0026quot;${VAR1}na\u015bcie ${CZEGO}\u0026quot;\nVAR3=\\$ESC\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also use output of a command (\u003Ccode\u003Esymfony\/process\u003C\/code\u003E is required, escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003ECOMM1=$(whoami)\nCOMM2=\\$(whoami)\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ERemember .env is a valid bash script.\u003C\/p\u003E\n\u003Ch3\u003EOther features\u003C\/h3\u003E\n\u003Cp\u003EYou can just read the variables from a file without populating it as environment variables: \u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$vars = (\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;read(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/..\/.env\u0027\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr just populate vars into environment without parsing a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;populate([\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also rever the process and dump vars into a .env file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;save(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/.env\u0027\u003C\/span\u003E, [\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr without saving to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$string = (\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;dump([\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EFill command\u003C\/h3\u003E\n\u003Cp\u003EDotenv provides a simple way to fill your \u003Ccode\u003E.env\u003C\/code\u003E file with values based on user input and defaults.\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s say you have an application with two modules that require some environment variables: \u003Ccode\u003EFoo\\Database\u003C\/code\u003E and \u003Ccode\u003EFoo\\Mailer\u003C\/code\u003E.\nInstall \u003Ccode\u003Esymfony\/console\u003C\/code\u003E and create a command that extends \u003Ccode\u003EAvris\\Dotenv\\Command\\FillCommand\u003C\/code\u003E, providing all the defaults:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EFillCommandImplementation\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \\\u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EDotenv\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003ECommand\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EFillCommand\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprotected\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetDefaults\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Eiterable\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E `Foo\\Database` =\u0026gt; [\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_HOST\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027127.0.0.1\u0027\u003C\/span\u003E,\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_DATABASE\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_USER\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027root\u0027\u003C\/span\u003E,\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_PASS\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0027\u003C\/span\u003E,\n        ]; \n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E `Foo\\Mailer` =\u0026gt; [\n            \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027MAILER_URL\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027null:\/\/localhost\u0027\u003C\/span\u003E,\n        ];\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ELet\u2019s say your \u003Ccode\u003E.env\u003C\/code\u003E file looks like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E###\u0026gt; Foo\\Database ###\u003C\/span\u003E\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\n\u003Cspan class=\u0022hljs-comment\u0022\u003E###\u0026lt; Foo\\Database ###\u003C\/span\u003E\n\nFOO=bar\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBoth \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E are missing and an additional variable \u003Ccode\u003EFOO\u003C\/code\u003E is defined.\u003C\/p\u003E\n\u003Cp\u003EIf you now \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/components\/console.html\u0022\u003Erun the command\u003C\/a\u003E,\nyou will be asked what should \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E be (defaults \u003Ccode\u003E\u0027\u0027\u003C\/code\u003E and \u003Ccode\u003Enull:\/\/localhost\u003C\/code\u003E are offered),\nand the values you submit will be put in the \u003Ccode\u003E.env\u003C\/code\u003E file without removing \u003Ccode\u003EFOO\u003C\/code\u003E.  \u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["dotenv","environment variables","php"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-dotenv_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_mini.png\u0022 alt=\u0022Avris Dotenv\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_mini.png\u0022 alt=\u0022Avris Dotenv\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/dotenv\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003E.env\u003C\/h3\u003E\n\u003Cp\u003EEnvironmental variables are a great way to adjust your application to a specific environment,\nespecially when it comes to sensitive data, like database password.\u003C\/p\u003E\n\u003Cp\u003EThose variables should be set by your HTTP server,\nbut for local development having a \u003Ccode\u003E.env\u003C\/code\u003E file is way simpler:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EAPP_ENV=prod\nAPP_DEBUG=0\n\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\nDB_PASS=pass\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll you need to do in your front controller is load this file using Dotenv:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;load(__DIR__ . \u0027\/..\/.env\u0027);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ENow all the variables from the file will be available via \u003Ccode\u003Egetenv\u003C\/code\u003E, \u003Ccode\u003E$_ENV\u003C\/code\u003E and \u003Ccode\u003E$_SERVER\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EAdvanced\u003C\/h3\u003E\n\u003Cp\u003EIf your variable value contains a space, remember to quote it:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EFOO=\u0022Lorem ipsum\u0022\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can add a comment if you start a line with a \u003Ccode\u003E#\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003E# comment\nFOO=bar\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can use vars inside other vars (escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EVAR1=osiem\nVAR2=\u0022${VAR1}na\u015bcie ${CZEGO}\u0022\nVAR3=\\$ESC\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also use output of a command (\u003Ccode\u003Esymfony\/process\u003C\/code\u003E is required, escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003ECOMM1=$(whoami)\nCOMM2=\\$(whoami)\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ERemember .env is a valid bash script.\u003C\/p\u003E\n\u003Ch3\u003EOther features\u003C\/h3\u003E\n\u003Cp\u003EYou can just read the variables from a file without populating it as environment variables: \u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$vars = (new \\Avris\\Dotenv\\Dotenv)-\u0026gt;read(__DIR__ . \u0027\/..\/.env\u0027);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr just populate vars into environment without parsing a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;populate([\n    \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n    \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also rever the process and dump vars into a .env file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;save(__DIR__ . \u0027\/.env\u0027, [\n    \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n    \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr without saving to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$string = (new \\Avris\\Dotenv\\Dotenv)-\u0026gt;dump([\n    \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n    \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EFill command\u003C\/h3\u003E\n\u003Cp\u003EDotenv provides a simple way to fill your \u003Ccode\u003E.env\u003C\/code\u003E file with values based on user input and defaults.\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s say you have an application with two modules that require some environment variables: \u003Ccode\u003EFoo\\Database\u003C\/code\u003E and \u003Ccode\u003EFoo\\Mailer\u003C\/code\u003E.\nInstall \u003Ccode\u003Esymfony\/console\u003C\/code\u003E and create a command that extends \u003Ccode\u003EAvris\\Dotenv\\Command\\FillCommand\u003C\/code\u003E, providing all the defaults:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Efinal class FillCommandImplementation extends \\Avris\\Dotenv\\Command\\FillCommand\n{\n    protected function getDefaults(): iterable\n    {\n        yield `Foo\\Database` =\u0026gt; [\n            \u0027DB_HOST\u0027 =\u0026gt; \u0027127.0.0.1\u0027,\n            \u0027DB_DATABASE\u0027 =\u0026gt; \u0027foo\u0027,\n            \u0027DB_USER\u0027 =\u0026gt; \u0027root\u0027,\n            \u0027DB_PASS\u0027 =\u0026gt; \u0027\u0027,\n        ]; \n        yield `Foo\\Mailer` =\u0026gt; [\n            \u0027MAILER_URL\u0027 =\u0026gt; \u0027null:\/\/localhost\u0027,\n        ];\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ELet\u2019s say your \u003Ccode\u003E.env\u003C\/code\u003E file looks like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003E###\u0026gt; Foo\\Database ###\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\n###\u0026lt; Foo\\Database ###\n\nFOO=bar\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBoth \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E are missing and an additional variable \u003Ccode\u003EFOO\u003C\/code\u003E is defined.\u003C\/p\u003E\n\u003Cp\u003EIf you now \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/components\/console.html\u0022\u003Erun the command\u003C\/a\u003E,\nyou will be asked what should \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E be (defaults \u003Ccode\u003E\u0027\u0027\u003C\/code\u003E and \u003Ccode\u003Enull:\/\/localhost\u003C\/code\u003E are offered),\nand the values you submit will be put in the \u003Ccode\u003E.env\u003C\/code\u003E file without removing \u003Ccode\u003EFOO\u003C\/code\u003E.  \u003C\/p\u003E","words":464,"readTime":2,"lang":"en"}}}}}