Atualizando o .env do Laravel em tempo de execução

Recentemente tive a necessidade de atualizar o arquivo .env do Laravel em tempo de execução da aplicação para armazenar e atualizar um token de uma API externa e utilizar banco de dados não era uma opção.

Você pode pensar na simplicidade dessa solução apenas reescrevendo o arquivo .env, mas vai se deparar com o fato do Laravel não atualizar o valor da chave e simplesmente incrementar o novo valor ao antigo.

MINHA_CHAVE=valorNovovalorAntigo

Solução

  1. Você deve se lembrar do comando key:generate , quando o framework faz a reescrita do .env para gerar uma chave para a nova aplicação, e é o código dele que vamos utilizar como referência para esta solução. Veja no código do repositório neste link;
  2. Para que este código cumpra seu papel, precisamos adicionar a chamada Artisan::call("config:cache"); . Você já deve conhecer este comando ;). Ele vai resetar o seu cache e combinar novamente os arquivos de configuração em um novo arquivo cacheado.

Método para alterar o arquivo .env

Indo diretamente ao ponto, nosso método ficará assim:

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Artisan;

...

public function atualizarArquivoPontoEnv($chave, $novoValor)
{
    Artisan::call("config:cache");
    $valorAntigo = env($chave);
    $caminhoArquivoPontoEnv = App::environmentFilePath();
    if (file_exists($caminhoArquivoPontoEnv)) {
        file_put_contents($caminhoArquivoPontoEnv, 
            str_replace(
                "{$key}={$valorAntigo}", 
                "{$key}={$novoValor}",     
                file_get_contents($caminhoArquivoPontoEnv)
            )
        );
    }
}

E você, já teve necessidade de atualizar o arquivo .env em tempo de execução?