Не могу получить доступ к переменным Heroku с помощью PHP - PullRequest
0 голосов
/ 02 апреля 2019

Я использую .env файл в качестве переменных подключения к базе данных. Я не могу поделиться файлом .env на GitHub, поэтому мне нужно использовать конфигурацию переменных Heroku (я установил их как локальный файл .env). Но когда я звоню getenv('VAR_NAME'), я получаю

Невозможно прочитать любой из файлов среды

потому что нет файла .env. Как я могу получить доступ к переменным Heroku с помощью PHP?

Редактировать: Я использую этот пакет: https://github.com/vlucas/phpdotenv

Вот мой код:

require_once __DIR__ . '../../vendor/autoload.php';
use PDO;
use Dotenv\Dotenv as Dotenv;
public function getConnection()
        {
            $this->db_connection = null;
            try
            {
                $dotenv = Dotenv::create(__DIR__ . '/..');
                $dotenv->load();
                $this->db_connection = new PDO("mysql:host=" . getenv('DB_HOST') . ";dbname=" . getenv('DB_DATABASE'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'));
                $this->db_connection->exec("set names utf8");
            }
            catch(PDOException $exception)
            {
                echo "Connection error: " . $exception->getMessage();
            }
            return $this->db_connection;
        }

__DIR__ . '/..' - локализация .env файла

В фреймворке Laravel также есть файл .env, но есть пост-скрипт, который создает файл .env, если он не существует:

(composer.json)
"scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ]
}

Когда я перестал использовать класс Dotenv, он начал работать.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Просто чтобы убедиться, что на heroku нет файла .env, все переменные, добавленные в config, будут доступны как переменные окружения. Поэтому я бы предложил тот же метод, что и Крис.

<?php
use Dotenv\Dotenv;

if (file_exists(__DIR__ . '/.env')) {
    $dotenv = Dotenv::create(__DIR__);
    $dotenv->load();
}

Убедитесь, что среда не является рабочей / промежуточной или файл .env существует.

0 голосов
/ 02 апреля 2019

vlucas/phpdotenv выдает исключение, если вы пытаетесь его инициализировать, и он не может найти подходящий .env файл. Это было обсуждено , и автор в конечном итоге решил не менять это поведение. В этом выпуске обсуждаются два обходных пути, оба из которых работают:

  1. Инициализировать Dotenv можно только в том случае, если файл найден, например, что-то вроде

    <?php
    use Dotenv\Dotenv;
    
    if (file_exists(__DIR__ . '/.env')) {
        $dotenv = Dotenv::create(__DIR__);
        $dotenv->load();
    }
    
  2. Поймать исключение, например

    <?php
    use Dotenv\Dotenv;
    use Dotenv\Exception\InvalidPathException;
    
    try {
        $dotenv = Dotenv::create(__DIR__);
        $dotenv->load();
    } catch (InvalidPathException $e) {
        // Do something
    }
    

Лично я предпочел бы, чтобы библиотека справлялась с этим изящно из коробки, но в противном случае я предпочел бы вариант 1 выше.

...