Я использую базовый шаблон yii 2. И я пытаюсь создавать разные среды. Например: разработка, тестирование, прод.
Итак, я установил пакет
"vlucas/phpdotenv": "^5.6"
И в корневой папке я создал файл .env с содержимым:
YII_DEBUG=1
YII_ENV=dev
DB_HOST=localhost
DB_NAME=name
DB_USER=postgres
DB_PASSWORD=pass
DB_CHARSET=utf8
и в config/db.php у меня есть это:
<?php
// phpcs:ignoreFile
$config = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=' . $_ENV['DB_HOST'] .';dbname=' . $_ENV['DB_NAME'],
'username' => $_ENV['DB_USER'],
'password' => $_ENV['DB_PASSWORD'],
'charset' => $_ENV['DB_CHARSET'],
];
и мой web/index.php выглядит:
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();
$config = require __DIR__ . '/../config/web.php';
(new yii\web\Application($config))->run();
но если я это сделаю сейчас, PHP yii послужит. Я получаю эту ошибку:
Warning: Undefined array key "DB_HOST" in C:\repos\internet_backend\config\db.php on line 9
PHP Warning: Undefined array key "DB_NAME" in C:\repos\internet_backend\config\db.php on line 9
Warning: Undefined array key "DB_NAME" in C:\repos\internetsuite_backend\config\db.php on line 9
PHP Warning: Undefined array key "DB_USER" in C:\repos\internet_backend\config\db.php on line 10
Warning: Undefined array key "DB_USER" in C:\repos\internet_backend\config\db.php on line 10
PHP Warning: Undefined array key "DB_PASSWORD" in C:\repos\internet_backend\config\db.php on line 11
Вопрос: Но как устранить эту ошибку?
Вам нужно использовать класс Dotenv\Dotenv
для загрузки файла .env
. Вы должны сделать это в своем файле web/index.php
после загрузки автозагрузчика композитора и перед загрузкой файла конфигурации.
<?php
// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();
$config = require __DIR__ . '/../config/web.php';
(new yii\web\Application($config))->run();
Возможно, вам придется аналогичным образом изменить файл yii
в корне вашего проекта.
Кроме того, вокруг =
в .env
файле не должно быть пробелов.
#Михал Гинчица.Спасибо!! Да, я забыл изменить файл yii.php. После того, как я это сделал. Оно работает.
Но у меня три разные папки: dev, test, prod. И в каждой папке у меня есть файл .env. Как выйти из окружения?
Вы передаете папку, из которой загружается файл .env
, в качестве параметра при вызове Dotenv\Dotenv::createImmutable()
. У вас должна быть возможность изменить это там.
По этому поводу я задал еще один вопрос: stackoverflow.com/questions/78383882/…
У кого-нибудь есть идеи?