2017-08-25 23 views
8

J'ai fait une nouvelle installation de Symfony en utilisant Symfony Flex et le nouveau squelette appartient à la prochaine structure de répertoire Symfony 4. J'ai ajouté et configuré un premier groupe tiers: HWIOAuthBundle. Ce bundle est utilisé pour se connecter via Twitter en utilisant deux informations secrètes. Je déclare mon consumer_id et mon consumer_secret dans le fichier config/packages/hwi_oauth.yaml.Comment puis-je récupérer mes variables d'environnement dans un fichier de paramètres dans la structure Symfony4?

hwi_oauth: 
    firewall_names: [secured_area] 
    resource_owners: 
     twitter: 
      type:   twitter 
      client_id:  XXXXXMyIdXXXXX 
      client_secret: XXXXXMyTopSecretKeyXXXXX 

Mon application fonctionne correctement. Mais je ne peux pas commettre mes secrets sur github!

Je veux avoir un fichier hwi_oauth.yaml comme celui-ci:

hwi_oauth: 
    firewall_names: [secured_area] 
    resource_owners: 
     twitter: 
      type:   twitter 
      client_id:  '%twitter_consumer_id%' 
      client_secret: '%twitter_consumer_secret%' 

J'ai lu le Symfony4 best practices sur le nouveau package DotEnv.

Using environment variables, while far from being perfect, have many benefits over what we currently do. Environment variables are a more "standard" way of managing settings that depend on the environment (no need to manage a parameters.yml.dist for instance).

Comme suggéré dans les meilleures pratiques, je joins ces deux lignes à .env fichier:

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX 
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX 

Mais je rencontrais cette erreur:

You have requested a non-existent parameter "twitter_consumer_id".

J'ai essayé avec %kernel.twitter_consumer_id%, %env.twitter_consumer_id%, %env(TWITTER_CONSUMER_ID)% sans plus de succès.

Le dernier test retourne ce message d'erreur:

An exception has been thrown during the rendering of a template ("Environment variable not found: "TWITTER_CONSUMER_ID".").

Comment puis-je récupérer mes variables ENV dans un fichier de paramètres comme hwi_oauth.yaml?

+1

Êtes-vous en train de charger le '.env' avec le composant' DotEnv'? – bishop

+0

Merci @bishop! Le 'public \ index.php' contient' if (! Getenv ('APP_ENV')) {(nouveau Dotenv()) -> load (__ DIR __. '/ .. /. Env'); } 'et ce' .env' n'a pas été chargé. Ça fonctionne maintenant ! Mais la vérification est de s'assurer que nous n'utilisons pas '.env' dans la production. Je ne comprends pas comment l'utiliser en dev et encore protéger mon prod ... Est-il sécurisé de repasser le test '! Getenv ('APP_ENV')' par celui-ci: 'in_array (getenv ('APP_ENV'), [ 'dev', 'test']) '? –

Répondre

6

Vous devez charger le fichier .env au cours de votre processus de démarrage, pour que ces variables d'environnement disponibles:

(new DotEnv())->load(__DIR__ . '/../.env'); 

Vous devez planifier de mettre les clés secrètes dans les variables d'environnement sur le développement, la mise en scène, et production. Comment cela dépend, cependant. Lors du développement et de la mise en scène, vous utilisez peut-être des fichiers .env, alors qu'en production vous utilisez Apache pour l'injection.

Personnellement, j'utilise toujours les fichiers .env, et j'en garde un vide dans mon dépôt. De cette façon, il est très simple à déployer, et il n'y a pas de cas particuliers.

Si vous souhaitez utiliser uniquement les fichiers .env dans des environnements spécifiques, vous pouvez faire:

if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) { 
    (new DotEnv())->load(__DIR__ . '/../.env'); 
} 
+1

Merci beaucoup @bishop! –

+2

+1 Même si 'getenv ('APP_ENV')' nécessitera de définir la variable d'environnement 'APP_ENV' var dans votre machine de développement locale. Je suggère d'ajouter la valeur par défaut 'if (! Getenv ('APP_ENV') || ...)'. – yceruto

+0

En effet, @yceruto. On doit définir une variable d'environnement pour charger les variables d'environnement. O_o Une partie de la raison pour laquelle j'utilise inconditionnellement des fichiers env. – bishop

4

Pour test environnements, je vous suggère de créer également un script bootstrap.php pour remplacer les paramètres .env:

essais/bootstrap.php:

<?php 

use Symfony\Component\Dotenv\Dotenv; 

require_once __DIR__.'/../vendor/autoload.php'; 

$dotEnv = new Dotenv(); 
$dotEnv->load(__DIR__.'/../.env'); 
$dotEnv->populate([ 
    'APP_ENV' => 'test', 
    'DATABASE_URL' => '...' 
    // ... 
]); 

phpunit.xml.dist:

<?xml version="1.0" encoding="UTF-8"?> 

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" 
     bootstrap="tests/bootstrap.php" <--- set 
     ... 
> 
    ... 
</phpunit> 
+0

Ça marche bien aussi! Merci beaucoup! –