7

sto usando dotenv per PHP per gestire le impostazioni di ambiente (non lavarel ma ho taggato perché lavarel utilizza anche dotenv)dotenv richiede file di .env sulla produzione

Ho escluso il .env dalla base di codice e ho aggiunto il .env.example per tutti gli altri collaboratori

nella pagina GitHub di dotenv:

phpdotenv è fatto per gli ambienti di sviluppo, e in genere non deve essere utilizzato in produzione. Nella produzione, le variabili di ambiente effettive devono essere impostate in modo che non ci sia sovraccarico del caricamento del file .env su ogni richiesta. Questo può essere ottenuto tramite un processo di distribuzione automatizzato con strumenti come Vagrant, chef o Puppet o può essere impostato manualmente con host cloud come Pagodabox e Heroku.

La cosa che non capisco è che ottengo la seguente eccezione:

PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Dotenv: Environment file .env not found or not readable.

Questo contraddice con quello che la documentazione dice "le variabili d'ambiente effettivi devono essere impostate in modo che non ci sia sovraccarico del caricamento del file .env su ogni richiesta. "

Quindi la domanda è se c'è qualche ragione per cui dotenv lancia quell'eccezione e/o mi manca qualcosa? Prima di tutto il comportamento è diverso rispetto ad altre biblioteche dotenv (Ruby)

Posso facilmente ovviare a questo, la soluzione non così bello:

if(getenv('APPLICATION_ENV') !== 'production') { /* or staging */ 
    $dotenv = new Dotenv\Dotenv(__DIR__); 
    $dotenv->load(); 
} 

soluzione più bella di me, ma penso che dotenv dovrebbe gestire questo.

risposta

7

Dotenv è stato costruito attorno a un'idea, che verrà utilizzata solo negli ambienti di sviluppo. Pertanto, si aspetta sempre che il file .env sia presente.

La soluzione che non ti piace è un metodo consigliato per utilizzare Dotenv. E sembra, che sia won't change in near future. Related discussione del progetto issue tracker: https://github.com/vlucas/phpdotenv/issues/63#issuecomment-74561880

nota, che Mark offers c'è un buon approccio per gli ambienti di produzione/staging, che salta il caricamento del file, ma non convalida

$dotenv = new Dotenv\Dotenv(); 
if(getenv('APP_ENV') === 'development') { 
    $dotenv->load(__DIR__); 
} 
$dotenv->required('OTHER_VAR'); 
+0

Aaah I può usare '$ dotenv-> required()' funziona in qualsiasi modo che sia bello. Il 'getenv ('APP_ENV');' è più sicuro credo? Penso di andare per il filecheck che andrà bene per il progetto attuale. Grazie! –

+0

@SanderVisser cosa volevi dire dicendo che 'getenv ('APP_ENV')' è più sicuro? – Alik

+0

Impedisce il caricamento del file .env in un ambiente di produzione anche se è presente. –

0

Se avete problema di creare un APP_ENV variabile, questo codice è più semplice:

$dotenv = new Dotenv\Dotenv(__DIR__); 
if(file_exists(".env")) { 
    $dotenv->load(); 
} 
0

visto anche in questo, la mia soluzione attuale è quella di utilizzare Lumen's way (come del 6 giugno 2016) che era suggested in a discussion:

try { 
    (new Dotenv\Dotenv(__DIR__.'/../'))->load(); 
} catch (Dotenv\Exception\InvalidPathException $e) { 
    // 
} 

È ancora possibile eseguire ulteriori operazioni di gestione delle eccezioni, se necessario (ad es. ricadere sui valori predefiniti o eseguire alcune convalide.

+1

Ciò vanifica lo scopo di "nessun sovraccarico di caricamento del file .env su ogni richiesta" –

Problemi correlati