Carrega variáveis de ambiente de .env
para getenv()
, $_ENV
e $_SERVER
automaticamente.
Você nunca deve armazenar credenciais confidenciais em seu código . Armazenar a configuração no ambiente é um dos princípios de um aplicativo de doze fatores. Qualquer coisa que possa mudar entre os ambientes de implantação – como credenciais de banco de dados ou credenciais de serviços de terceiros – deve ser extraída do código em variáveis de ambiente.
Basicamente, um arquivo .env
é uma maneira fácil de carregar variáveis de configuração personalizadas que seu aplicativo precisa, sem precisar modificar arquivos .htaccess ou hosts virtuais Apache/nginx. Isso significa que você não terá que editar nenhum arquivo fora do projeto e todas as variáveis de ambiente serão sempre definidas, não importa como você execute seu projeto - Apache, Nginx, CLI e até mesmo o servidor web integrado do PHP. É MUITO mais fácil do que todas as outras maneiras que você conhece de definir variáveis de ambiente, e você vai adorar!
php_value
aos arquivos .htaccessPHP dotenv é uma versão PHP do Ruby dotenv original.
A instalação é super fácil via Composer:
$ composer require vlucas/phpdotenv
ou adicione-o manualmente ao seu arquivo composer.json
.
Seguimos o controle de versão semântico, o que significa que podem ocorrer alterações significativas entre os lançamentos principais. Temos guias de atualização disponíveis para V2 a V3, V3 a V4 e V4 a V5 disponíveis aqui.
O arquivo .env
geralmente é mantido fora do controle de versão, pois pode conter chaves de API e senhas confidenciais. Um arquivo .env.example
separado é criado com todas as variáveis de ambiente necessárias definidas, exceto as sensíveis, que são fornecidas pelo usuário para seus próprios ambientes de desenvolvimento ou comunicadas em outro lugar aos colaboradores do projeto. Os colaboradores do projeto então copiam independentemente o arquivo .env.example
para um .env
local e garantem que todas as configurações estejam corretas para seu ambiente local, preenchendo as chaves secretas ou fornecendo seus próprios valores quando necessário. Neste uso, o arquivo .env
deve ser adicionado ao arquivo .gitignore
do projeto para que nunca seja confirmado por colaboradores. Esse uso garante que nenhuma senha confidencial ou chave de API estará no histórico de controle de versão, portanto, há menos risco de violação de segurança e os valores de produção nunca terão que ser compartilhados com todos os colaboradores do projeto.
Adicione a configuração do seu aplicativo a um arquivo .env
na raiz do seu projeto. Certifique-se de que o arquivo .env
seja adicionado ao seu .gitignore
para que não seja feito check-in no código
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
Agora crie um arquivo chamado .env.example
e coloque-o no projeto. Isso deve ter as variáveis ENV que você precisa definir, mas os valores devem estar em branco ou preenchidos com dados fictícios. A ideia é permitir que as pessoas saibam quais variáveis são necessárias, mas não fornecer-lhes os valores de produção sensíveis.
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
Você pode então carregar .env
em seu aplicativo com:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
Para suprimir a exceção lançada quando não há arquivo .env
, você pode:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
Opcionalmente, você pode passar um nome de arquivo como segundo parâmetro, se quiser usar algo diferente de .env
:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
Todas as variáveis definidas estão agora disponíveis nas superglobais $_ENV
e $_SERVER
.
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
Usar getenv()
e putenv()
é fortemente desencorajado devido ao fato de que essas funções não são thread-safe, porém ainda é possível instruir o PHP dotenv a usar essas funções. Em vez de chamar Dotenv::createImmutable
, pode-se chamar Dotenv::createUnsafeImmutable
, que adicionará o PutenvAdapter
nos bastidores. Suas variáveis de ambiente agora estarão disponíveis usando o método getenv
, bem como os superglobais:
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
É possível aninhar uma variável de ambiente dentro de outra, útil para reduzir a repetição.
Isso é feito envolvendo uma variável de ambiente existente em ${…}
por exemplo
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
Imutabilidade refere-se a se Dotenv tem permissão para substituir variáveis de ambiente existentes. Se você quiser que Dotenv substitua variáveis de ambiente existentes, use createMutable
em vez de createImmutable
:
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
Nos bastidores, isso instrui o "repositório" para permitir a imutabilidade ou não. Por padrão, o repositório é configurado para permitir a substituição de valores existentes por padrão, o que é relevante se alguém estiver chamando o método "create" usando o RepositoryBuilder
para construir um repositório mais personalizado:
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
O exemplo acima escreverá valores carregados em $_ENV
e putenv
, mas ao interpolar variáveis de ambiente, leremos apenas $_ENV
. Além disso, nunca substituirá nenhuma variável já definida antes de carregar o arquivo.
Por meio de outro exemplo, também é possível especificar um conjunto de variáveis a serem listadas como permitidas. Ou seja, serão carregadas apenas as variáveis da lista de permissões:
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv possui funcionalidade de validação integrada, inclusive para impor a presença de uma variável de ambiente. Isso é particularmente útil para permitir que as pessoas conheçam quaisquer variáveis obrigatórias explícitas sem as quais seu aplicativo não funcionará.
Você pode usar uma única string:
$ dotenv -> required ( ' DATABASE_DSN ' );
Ou uma matriz de strings:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
Se alguma variável ENV estiver faltando, Dotenv lançará uma RuntimeException
como esta:
One or more environment variables failed assertions: DATABASE_DSN is missing
Além de simplesmente exigir que uma variável seja definida, você também pode precisar garantir que a variável não esteja vazia:
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
Se a variável de ambiente estiver vazia, você receberá uma exceção:
One or more environment variables failed assertions: DATABASE_DSN is empty
Talvez você também precise garantir que a variável tenha um valor inteiro. Você pode fazer o seguinte:
$ dotenv -> required ( ' FOO ' )-> isInteger ();
Se a variável de ambiente não for um número inteiro, você receberá uma exceção:
One or more environment variables failed assertions: FOO is not an integer.
Pode-se querer impor regras de validação apenas quando uma variável é definida. Apoiamos isso também:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
Pode ser necessário garantir que uma variável esteja no formato booleano, aceitando "true", "false", "On", "1", "Yes", "Off", "0" e "No". Você pode fazer o seguinte:
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
Se a variável de ambiente não for booleana, você receberá uma exceção:
One or more environment variables failed assertions: FOO is not a boolean.
Da mesma forma, pode-se escrever:
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
Também é possível definir um conjunto de valores que sua variável de ambiente deve ter. Isso é especialmente útil em situações em que apenas algumas opções ou drivers são realmente suportados pelo seu código:
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
Se a variável de ambiente não estivesse nesta lista de valores permitidos, você obteria uma exceção semelhante:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
Também é possível definir uma regex que sua variável de ambiente deveria ser.
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
Você pode comentar seu arquivo .env
usando o caractere #
. Por exemplo
# this is a comment
VAR= " value " # comment
VAR=value # comment
Às vezes, você só quer analisar o arquivo e resolver as variáveis de ambiente aninhadas, fornecendo-nos uma string, e ter um array retornado para você. Embora isso já seja possível, é um pouco complicado, por isso fornecemos uma maneira direta de fazer isso:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
Isso é exatamente o mesmo que:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
apenas, em vez de fornecer o diretório para localizar o arquivo, você forneceu diretamente o conteúdo do arquivo.
Quando um novo desenvolvedor clonar sua base de código, ele terá uma etapa única adicional para copiar manualmente o arquivo .env.example
para .env
e preencher seus próprios valores (ou obter quaisquer valores confidenciais de um colega de trabalho do projeto).
Em certas configurações de servidor (mais comumente encontradas em hospedagem compartilhada), o PHP pode desativar superglobais como $_ENV
ou $_SERVER
. Se essas variáveis não estiverem definidas, revise as variables_order
no arquivo php.ini
. Consulte php.net/manual/en/ini.core.php#ini.variables-order.
Se você descobrir uma vulnerabilidade de segurança neste pacote, envie um e-mail para [email protected]. Todas as vulnerabilidades de segurança serão prontamente resolvidas. Você pode ver nossa política de segurança completa aqui.
PHP dotenv está licenciado sob a licença BSD de 3 cláusulas.
Disponível como parte da assinatura Tidelift
Os mantenedores do vlucas/phpdotenv
e milhares de outros pacotes estão trabalhando com o Tidelift para fornecer suporte comercial e manutenção para as dependências de código aberto que você usa para construir seus aplicativos. Economize tempo, reduza riscos e melhore a integridade do código, enquanto paga os mantenedores das dependências exatas que você usa. Saber mais.