Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony .env.local pas pris en compte

Sujet résolu
    17 septembre 2020 à 10:17:32

    Bonjour,

    Mon fichier .env.local n'est pas pris en compte, seul le .env est utilisé. Comment résoudre ce problème? Mes deux fichiers sont identiques donc je ne comprends pas pourquoi le .local ne fonctionne pas.

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2020 à 10:36:51

      J'ai défini comme cela dans mes deux fichiers:

      APP_ENV=dev



      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2020 à 10:47:29

        Comme tes 2 fichiers sont identiques ...

        Que retourne au début d'un contrôleur ?

        dd($this->getParameter('kernel.environment'));

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2020 à 10:50:08

          Le retour:

          SecurityController.php on line 30:
          "dev"


          Edit: Quand je dis que mes fichiers sont identiques j'ai bien évidemment changé la valeur de certains paramètres pour vérifier que c'était le .env qui était utilisé et non .env.local

          -
          Edité par Akame14 17 septembre 2020 à 10:51:55

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2020 à 10:59:06

            Pour ma part cela fonctionne

            Mais

            Je n'ai qu'une seule définition du APP_ENV qui est dans .env avec pour valeur dev en développement et prod en production.

            Mes 2 fichiers sont loin d'être identiques : seules les valeurs particulières liées au dev ... trace, log, etc sont dans le fichier .env.local

            A+

            • Partager sur Facebook
            • Partager sur Twitter
              17 septembre 2020 à 11:05:01

              Donc, si je comprends bien dans mon .env.local je ne dois pas définir le APP_ENV? Ce que j'ai actuellement.

              .env:

              ###> symfony/framework-bundle ###
              APP_ENV=dev
              APP_SECRET=xxxxxxxxxxxx
              #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
              #TRUSTED_HOSTS='^localhost|example\.com$'
              ###< symfony/framework-bundle ###
              
              ###> symfony/mailer ###
              # MAILER_DSN=smtp://localhost
              MAILER_USER=someaddress@mail.tld
              MAILER_URL=sendmail://localhost
              ###< symfony/mailer ###
              
              
              ###> doctrine/doctrine-bundle #
              ### Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
               ## For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
               ## For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8"
               ## IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
               DATABASE_URL=mysql://root:root@127.0.0.1:3306/intranet?serverVersion=mariadb-10.3.22&charset=utf8
               ####< doctrine/doctrine-bundle ###

              .env.local:

              ###> symfony/framework-bundle ###
              APP_ENV=dev
              APP_SECRET=xxxxxxxxxxxxxxx
              #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
              #TRUSTED_HOSTS='^localhost|example\.com$'
              ###< symfony/framework-bundle ###
              
              ###> symfony/mailer ###
              # MAILER_DSN=smtp://localhost
              MAILER_USER=someaddress@mail.tld
              MAILER_URL=sendmail://localhost
              ###< symfony/mailer ###
              
              
              ###> symfony/ldap ###
              LDAP_PASS="xxxxx"
              LDAP_BASE_DN="xxxxx"
              LDAP_SEARCH_DN="xxxxx"
              LDAP_UID_KEY="xxxx"
              LDAP_FILTER="xxxx"
              ###< symfony/ldap ###
              
              ###> doctrine/doctrine-bundle ###
              # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
              # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
              # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8"
              # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
              DATABASE_URL=mysql://root:root@127.0.0.1:3306/intranet?serverVersion=mariadb-10.3.22&charset=utf8
              ###< doctrine/doctrine-bundle ###
              




              -
              Edité par Akame14 17 septembre 2020 à 11:14:28

              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2020 à 11:08:43

                Oui pour moi c'est ainsi et cela fonctionne depuis des années.

                Tu peux tester ?

                A+

                • Partager sur Facebook
                • Partager sur Twitter
                  17 septembre 2020 à 11:14:14

                  J'ai testé, j'ai enlevé le APP_ENV de mon .env.local mais il n'est toujours pas pris en compte. Il ressemble donc à ça:

                  ###> symfony/framework-bundle ###
                  #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
                  #TRUSTED_HOSTS='^localhost|example\.com$'
                  ###< symfony/framework-bundle ###
                   
                  ###> symfony/mailer ###
                  # MAILER_DSN=smtp://localhost
                  MAILER_USER=someaddress@mail.tld
                  MAILER_URL=sendmail://localhost
                  ###< symfony/mailer ###
                   
                   
                  ###> symfony/ldap ###
                  LDAP_PASS="xxxxx"
                  LDAP_BASE_DN="xxxxx"
                  LDAP_SEARCH_DN="xxxxx"
                  LDAP_UID_KEY="xxxx"
                  LDAP_FILTER="xxxx"
                  ###< symfony/ldap ###
                   
                  ###> doctrine/doctrine-bundle ###
                  # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
                  # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
                  # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8"
                  # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
                  DATABASE_URL=mysql://root:root@127.0.0.1:3306/intranet?serverVersion=mariadb-10.3.22&charset=utf8
                  ###< doctrine/doctrine-bundle ###

                  Du coup j'ai une erereur quand j'essaye d'accéder à mes variables d'environnement:

                  Environment variable not found: "LDAP_BASE_DN".




                  -
                  Edité par Akame14 17 septembre 2020 à 11:21:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 septembre 2020 à 11:23:48

                    Alors là c'est autre chose ... comment fais tu pour accéder à tes variables d'environnement ?

                    A+

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 septembre 2020 à 11:25:43

                      Dans mon services.yaml j'y accède comme ceci:

                      parameters:
                          locale: 'fr'
                          ldap_host: "%env(resolve:LDAP_HOST)%"
                          ldap_pass: "%env(resolve:LDAP_PASS)%"
                          ldap_base_dn: "%env(resolve:LDAP_BASE_DN)%"
                          ldap_search_dn: "%env(resolve:LDAP_SEARCH_DN)%"
                          ldap_uid_key: "%env(resolve:LDAP_UID_KEY)%"
                          ldap_filter: "%env(resolve:LDAP_FILTER)%"


                      Et je les réutilise dans le même fichier plus loin comme ceci:

                      App\Security\LdapUserProvider:
                              arguments:
                                  - '@Symfony\Component\Ldap\Ldap'
                                  - '%ldap_base_dn%'
                                  - "@doctrine.orm.default_entity_manager"
                                  - '%ldap_search_dn%'
                                  - '%ldap_pass%'
                                  - $defaultRoles:
                                        'ROLE_USER'
                                  - '%ldap_uid_key%'
                                  - '%ldap_filter%'

                      Imaginons que je mette les deux mêmes variables d'env dans mes deux fichiers mais avec des valeurs différentes et que je dump la valeur récupérée par mon service, c'est la valeur dans le .env qui est affichée.

                      -
                      Edité par Akame14 17 septembre 2020 à 11:28:24

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 septembre 2020 à 11:30:50

                        Ok et tu as toujours une définition de tes variables dans le .env ?

                        car 

                        • .env: defines the default values of the env vars needed by the application;
                        • .env.local: overrides the default values for all environments but only on the machine which contains the file. This file should not be committed to the repository and it’s ignored in the test environment (because tests should produce the same results for everyone);

                        A+ 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 septembre 2020 à 11:39:31

                          Oui toutes mes variables d'environnement sont définies dans le .env et dans le .env.local, sauf le APP_ENV du coup qui est présent uniquement dans le .env. 

                          .env:

                          ###> symfony/framework-bundle ###
                          APP_ENV=dev
                          APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
                          ###> symfony/mailer ###
                          # MAILER_DSN=smtp://localhost
                          MAILER_USER=someaddress@mail.tld
                          MAILER_URL=sendmail://localhost
                          ###< symfony/mailer ###
                          
                          ###> symfony/ldap ###
                          LDAP_HOST=ldap_host
                          LDAP_PASS=your_ldap_pass
                          LDAP_BASE_DN=ldap_base_dn
                          LDAP_SEARCH_DN=ldap_search_dn
                          LDAP_UID_KEY=sAMAccountName
                          LDAP_FILTER=(&(objectClass=Person)({uid_key}={username}))
                          ###< symfony/ldap ###
                          
                          ###> doctrine/doctrine-bundle #
                          ### Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
                           ## For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
                           ## For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8"
                           ## IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
                           DATABASE_URL=mysql://root:root@127.0.0.1:3306/intranet?serverVersion=mariadb-10.3.22&charset=utf8
                           ####< doctrine/doctrine-bundle ###
                          

                          .env.local

                          ###> symfony/framework-bundle ###
                          APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
                          #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
                          #TRUSTED_HOSTS='^localhost|example\.com$'
                          ###< symfony/framework-bundle ###
                          
                          ###> symfony/mailer ###
                          # MAILER_DSN=smtp://localhost
                          MAILER_USER=someaddress@mail.tld
                          MAILER_URL=sendmail://localhost
                          ###< symfony/mailer ###
                          
                          
                          ###> symfony/ldap ###
                          LDAP_HOST=azdaq
                          LDAP_PASS="cqaszcqsw"
                          LDAP_BASE_DN="vsvfqdv"
                          LDAP_SEARCH_DN="zefcaqesf"
                          LDAP_UID_KEY="afaqf"
                          LDAP_FILTER="ezzzzzzzzzzzzzzzzz"
                          ###< symfony/ldap ###
                          
                          ###> doctrine/doctrine-bundle ###
                          # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
                          # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
                          # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8"
                          # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
                          DATABASE_URL=mysql://root:root@127.0.0.1:3306/intranet?serverVersion=mariadb-10.3.22&charset=utf8
                          ###< doctrine/doctrine-bundle ###
                          


                          Je ne vois vraiment pas d'où peut venir le problème.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 septembre 2020 à 12:16:04

                            Alors la seule différence qui reste pour ma part c'est que je n'ai pas resolve

                            ldap_host: "%env(resolve:LDAP_HOST)%"

                            mais ce serait pour moi :

                            ldap_host: "%env(LDAP_HOST)%"

                            A+


                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 septembre 2020 à 12:23:17

                              J'ai enlevé mes resolve, mais toujours rien :/ Je suis vraiment perdue pour le coup. Sous symfony mon fichier .env.local est de couleur marron, comme le vendor, est-ce que ça indique un problème?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 septembre 2020 à 12:28:16

                                Là je suis sec car tu as, à priori, le même type de configuration aux paramètres prêts et moi cela fonctionne ...

                                Es tu sous Linux ?  As tu regardé à tout hasard si les droits sur le fichier étaient corrects ? Le fichier .env.local est bien aussi directement sous la racine de ton projet comme le .env ?

                                A+

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 septembre 2020 à 12:57:59

                                  Salut

                                  Est-ce que par hasard la commande dump-env de Symfony aurait été lancée ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 septembre 2020 à 13:02:02

                                    Le fichier est en 777 et bien sous la racine du projet, au même niveau que .env. C'est très bizarre que ça ne fonctionne pas :/ C'est comme si le .env.local était ignoré, ou alors le projet ne le détecte pas?

                                    Edit:

                                    @Ymox, non je n'ai pas souvenir d'avoir lancé cette commande, d'autant plus que je ne la connais pas ^^

                                    -
                                    Edité par Akame14 17 septembre 2020 à 13:03:09

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 septembre 2020 à 13:07:16

                                      Quelle version de Symfony ou de symfony/dotenv utilises-tu ? Parce que ce comportement de .env.truc est relativement récent il me semble, apparemment Symfony 4.4, donc pas vraiment avant.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 septembre 2020 à 13:13:20

                                        Ma version de dotenv dans mon composer.lock:

                                        "name": "symfony/dotenv",
                                        "version": "v4.4.11",

                                        -
                                        Edité par Akame14 17 septembre 2020 à 13:13:45

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 septembre 2020 à 13:19:29

                                          Si tu renommes le .env en .truc (donc tu laisses le .env.local), que se passe-t'il ?

                                          Dans le cas où il faut un .env avant de re re-renommer .truc, si tu créés un .env vide, est-ce que ça change quelque chose ?

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            17 septembre 2020 à 13:23:09

                                            J'ai renommé mon fichier en .truc et visiblement il est toujours appelé car j'arrive à récupérer la valeur de ma variable O.O Si je créé un nouveau fichier .env vide, tout en gardant mon fichier en .truc, il ne se passe rien de spécial je récupère toujours la variable de .truc

                                            Edit: en regardant les fichiers qui étaient impactés par le changement de nom du fichier j'ai bootstrap.php:

                                            <?php
                                            
                                            use Symfony\Component\Dotenv\Dotenv;
                                            
                                            require dirname(__DIR__).'/vendor/autoload.php';
                                            
                                            // Load cached env vars if the .env.local.php file exists
                                            // Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
                                            if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
                                                foreach ($env as $k => $v) {
                                                    $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v);
                                                }
                                            } elseif (!class_exists(Dotenv::class)) {
                                                throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
                                            } else {
                                                // load all the .env files
                                                (new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env');
                                            }
                                            
                                            $_SERVER += $_ENV;
                                            $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
                                            $_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];
                                            $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';
                                            

                                            Edit 2 :

                                            A la ligne 6 on voit qu'il cherche le fichier .env.local.php alors que mon fichier s'appelle .env.local. Est-ce le problème? J'ai essayé de changer en .env.local mais ça ne marche toujours pas.

                                            -
                                            Edité par Akame14 17 septembre 2020 à 13:34:23

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 septembre 2020 à 13:37:30

                                              Pour info, je suis en 4.4.13 donc pas de différence.

                                              Tu as essayé de vider le cache pour recompiler ?

                                              J'ai le même fichier bootstrap.php et le fichier .env.local.php est générer que si commande dite par Ymox. Moi je ne l'ai pas.

                                              A+

                                              -
                                              Edité par monkey3d 17 septembre 2020 à 13:41:33

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 septembre 2020 à 13:40:11

                                                J'ai fait un composer clearcache mais rien ne change :/
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 septembre 2020 à 13:40:53

                                                  Il fallait juste renommer le(s) fichier(s), pas toutes les occurrences dans le projet si jamais, sans quoi c'est sûr qu'il va continuer à charger le fichier qu'on voulait mettre de côté en le renommant.

                                                  Et c'est pas le cache de composer qu'il faut nettoyer, mais celui de Symfony.

                                                  -
                                                  Edité par Ymox 17 septembre 2020 à 13:42:04

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 septembre 2020 à 13:42:34

                                                    C'est php bin/console cache:clear qu'il faut faire ...

                                                    A+

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 septembre 2020 à 13:45:19

                                                      Si j'ai mon fichier .truc et que je lance cache:clear

                                                      PHP Fatal error:  Uncaught Symfony\Component\Dotenv\Exception\PathException: Unable to read the "/home/xxx/projets/xxxx/.env" environment file. in /home/xxx/projets/xxxx/vendor/symfony/dotenv/Dotenv.php:510
                                                      Stack trace:
                                                      #0 /home/xxx/projets/xxxx/vendor/symfony/dotenv/Dotenv.php(65): Symfony\Component\Dotenv\Dotenv->doLoad()
                                                      #1 /home/xxx/projets/xxxx/vendor/symfony/dotenv/Dotenv.php(85): Symfony\Component\Dotenv\Dotenv->load()
                                                      #2 /home/xxx/projets/xxxx/config/bootstrap.php(17): Symfony\Component\Dotenv\Dotenv->loadEnv()
                                                      #3 /home/xxx/projets/xxxx/bin/console(30): require('/home/xxx/pr...')
                                                      #4 {main}
                                                        thrown in /home/xxx/projets/xxxx/vendor/symfony/dotenv/Dotenv.php on line 510
                                                      


                                                      Donc je créé un .env vide puis cache:clear. Résultat:

                                                      Environment variable not found: "DATABASE_URL".
                                                      Et ainsi de suite pour toutes les variables que j'utilise.

                                                      -
                                                      Edité par Akame14 17 septembre 2020 à 13:49:12

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        17 septembre 2020 à 13:51:40

                                                        Bah oui, c'est normal ... si tu regardes quelque post plus haut j'ai sorti le paragraphe de la doc qui indique comment cela fonctionne :

                                                        • .env: defines the default values of the env vars needed by the application;
                                                        • .env.local: overrides the default values for all environments but only on the machine which contains the file. This file should not be committed to the repository and it’s ignored in the test environment (because tests should produce the same results for everyone);

                                                        Donc ton .env doit avoir les variables que tu utilises.

                                                        Je pense que nous sommes près du but ... o_O

                                                        A+

                                                        -
                                                        Edité par monkey3d 17 septembre 2020 à 13:52:38

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 septembre 2020 à 13:53:19

                                                          Oui mais du coup ça revient au même, dans tous les cas il prend .env et non pas .env.local si je renseigne toutes les variables.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 septembre 2020 à 13:55:03

                                                            As tu essayé pour répondre ceci ? et après avoir fat de nouveau un cache:clear ?

                                                            A+

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Symfony .env.local pas pris en compte

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown