Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save paulofreitas/7a3ef4ab4d37b00cc63130ab478de95f to your computer and use it in GitHub Desktop.
Save paulofreitas/7a3ef4ab4d37b00cc63130ab478de95f to your computer and use it in GitHub Desktop.
Laravel: Flexibilizando a configuração de ambiente

A configuração de ambiente é um tópico que mudou consideravelmente entre as versões 4.2, 5.0 e 5.1 do Laravel. Nessa evolução algumas coisas mudaram e infelizmente a documentação não necessariamente acompanhou as novidades de flexibilização de configuração.

Uma coisa que está documentada mas não é necessariamente explícita/clara é a possibilidade de compartilhar uma mesma aplicação em mais de um ambiente de configuração.

Imagine que você queira compartilhar uma aplicação para o ambiente de homologação (staging) e produção (production) apenas trocando as configurações de ambiente com base no domínio servido. Nos tempos do Laravel 4.x isso era configurado através de um recurso do próprio framework. Como você faria isso hoje? 🤔

Usando diferentes arquivos .env por ambiente, de modo que você pode ter um .env.staging para a homologação, um .env.production para a produção, um .env.testing para testes, etc. 😀

Mas como definir qual o ambiente que está sendo usado? Através da variável de ambiente APP_ENV. Ela é a informação chave do ambiente da aplicação, sendo portanto através dela que o framework toma qualquer decisão relacionada ao ambiente em que a aplicação está rodando.

Se por exemplo você tiver um arquivo .env cuja variável APP_ENV tenha o valor staging, nos bastidores o Laravel irá tentar carregar as variáveis de ambiente do arquivo .env.staging e estará efetivamente sobrescrevendo qualquer variável do arquivo .env. E como você já deve ter imaginado, essa variável APP_ENV não se limita ao arquivo .env: você pode usar as variáveis de ambiente a nível do servidor ou sistema para declarar ela, de modo que é possível até mesmo não precisar ter um arquivo .env genérico na raiz do projeto.

Isso aliás era algo que a documentação não esclarecia até então, de que as variáveis de ambiente externas podem não apenas sobrescrever as variáveis do arquivo .env como também substituir este arquivo. Não mais, algumas horas atrás enviei um patch para esclarecer isso (entre outras coisas) na documentação e o Taylor inclusive deu uma melhorada na minha proposta. :smile:

Note portanto que você pode usar as diretivas de configuração de ambiente do servidor web (Apache/Nginx/Lighttpd/LiteSpeed/etc) nas próprias definições de virtual host para determinar o ambiente que um dado domínio estará usando (através da variável APP_ENV), de modo que você pode compartilhar uma mesma instância da aplicação para diferentes ambientes através de diferentes arquivos .env. Isso sem precisar modificar uma única linha de código da aplicação. 😃

Observe que isso também pode ser aplicado ao artisan através da opção --env=. Se por exemplo você executar o comando php artisan migrate:refresh --env=staging, nos bastidores o Laravel estará levando em conta as informações presentes no arquivo .env.staging. 👍

Não menos importante, uma outra melhoria realizada na documentação da configuração de ambiente foi a inclusão de um aviso de segurança há muito tempo necessário a respeito do versionamento dos arquivos .env, de modo a deixar claro que isso nunca, jamais, em hipótese nenhuma deve ser feito. 😆

That's all, folks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment