Как выйти из среды с помощью dotenv в yii 2?

Я использую yii 2 и

Я установил пакет:

 "vlucas/phpdotenv": "^5.6"

И в корневом каталоге у меня есть папка env/dev/.env.dev.

Поэтому я изменил файл web/index.php следующим образом:

<?php
// phpcs:ignoreFile
$path = dirname(__DIR__) . '/env/dev';
require $path . '/vendor/autoload.php';
$dotEnv = Dotenv\Dotenv::createImmutable($path, '.env.dev');
$dotEnv->load();

defined('YII_DEBUG') or define('YII_DEBUG', $_ENV['YII_DEBUG']);
defined('YII_ENV') or define('YII_ENV', $_ENV['YII_ENV']);

require $path . '/vendor/yiisoft/yii2/Yii.php';

$config = require $path . '/config/web.php';

try {
    (new yii\web\Application($config))->run();
} catch (yii\base\InvalidConfigException $exception) {
    echo $exception->getMessage();
}

Я просто вижу, что __DIR__ ссылки на каталог:

c:\\repos\\internet_backend\\web"

и

'env/dev'

к:

c:\repos\internet_backend\env\dev

Но затем я получаю эту ошибку:

#Michal. Thank you for your contribution. But then I get this error: <br />
<b>Warning</b>: require(C:\repos\internet_backend/env/dev/vendor/autoload.php): Failed to open stream: No such
file or directory in <b>C:\repos\internet_backend\web\index.php</b> on line <b>4</b><br />
<br />
<b>Fatal error</b>: Uncaught Error: Failed opening required
'C:\repos\internet_2.0_backend/env/dev/vendor/autoload.php' (include_path='C:\xampp\php\PEAR') in
C:\repos\internet_2.0_backend\web\index.php:4
Stack trace:
#0 {main}
thrown in <b>C:\repos\internet_2.0_backend\web\index.php</b> on line <b>4</b><br />

Итак, что я попробовал. Стоит перейти по этой ссылке: https://matthewsetter.com/set-environment-variables-php-dotenv/

И реализовать его рекомендации

Вопрос: как запустить файл .env.dev?

🤔 А знаете ли вы, что...
PHP можно использовать для создания графических диаграмм и графиков.


93
1

Ответ:

Решено

Функция dirname() принимает путь в качестве первого аргумента. Он возвращает путь к родительскому каталогу по заданному пути. При желании вы можете указать второй аргумент $levels, но он должен быть целым числом и указывать, на сколько уровней вверх должна пройти функция dirname(), прежде чем вернуть результат.

Магическая константа __DIR__ содержит путь к каталогу, в котором находится текущий файл.

Итак, если вы в /path/to/my/project/web/index.php. Тогда dirname(__DIR__) вернется /path/to/my/project. Если вы вызовете это так, dirname(__DIR__, 2) вместо этого вернет /path/to/my.

Если вы хотите получить путь к /path/to/my/project/env/dev внутри /path/to/my/project/web/index.php, вы можете использовать:

$path = dirname(__DIR__) . '/env/dev';

Если ваш файл конфигурации называется .env.dev вместо .env, вы не можете указать его как часть пути к каталогу, а вместо этого вам придется указать имя файла в качестве второго параметра в вызове Dotenv\Dotenv::createImmutable($path, '.env.dev').

Обновлено: судя по вашему отредактированному вопросу, похоже, что у вас нет папки поставщика в папке /env/dev. Я предполагаю, что ваша папка /env содержит только файлы конфигурации .env.

Таким образом, весь код может выглядеть так:

<?php
// phpcs:ignoreFile
$path = dirname(__DIR__);
require $path . '/vendor/autoload.php';
$dotEnv = Dotenv\Dotenv::createImmutable($path . '/env/dev', '.env.dev');
$dotEnv->load();

defined('YII_DEBUG') or define('YII_DEBUG', $_ENV['YII_DEBUG']);
defined('YII_ENV') or define('YII_ENV', $_ENV['YII_ENV']);

require $path . '/vendor/yiisoft/yii2/Yii.php';

// I have no idea if your config file is in /config/web.php
// or in /env/dev/config/web.php so you need to adjust this as needed.
$config = require $path . '/config/web.php'; 

try {
    (new yii\web\Application($config))->run();
} catch (yii\base\InvalidConfigException $exception) {
    echo $exception->getMessage();
}

Если вы хотите изменить среду проекта без необходимости изменять файлы точек входа, такие как index.php, вы можете сделать следующее:

  1. Создайте глобальный файл .env в корне проекта, где вы будете настраивать только среду:
YII_ENV=dev
YII_DEBUG=1
  1. При необходимости создайте .env файлы для конкретной среды в /env/... папках. Лично я бы рекомендовал называть файлы только .env без расширений .dev, .test или .prod. Они уже есть в папках /env/dev, /env/test или /env/prod, и вам не нужно беспокоиться о передаче правильного имени файла при загрузке файла.

  2. В файлах точек входа, таких как /web/index.php или /yii, сначала загружайте глобальный файл .env, а затем используйте установочные переменные для загрузки файлов, специфичных для среды. Например вот так

<?php
// phpcs:ignoreFile
$path = dirname(__DIR__);
require $path . '/vendor/autoload.php';

// load global .env file
$dotEnv = Dotenv\Dotenv::createImmutable($path);
$dotEnv->load();

// load envirnoment specific .env file
$dotEnv = Dotenv\Dotenv::createImmutable($path . '/env/' . $_ENV['YII_ENV']);
// or if you have different file names based on env, you need to specify filename in second argument
// $dotEnv = Dotenv\Dotenv::createImmutable($path . '/env/' . $_ENV['YII_ENV'], '.env.' . $_ENV['YII_ENV']);
$dotEnv->load();

defined('YII_DEBUG') or define('YII_DEBUG', $_ENV['YII_DEBUG']);
defined('YII_ENV') or define('YII_ENV', $_ENV['YII_ENV']);

require $path . '/vendor/yiisoft/yii2/Yii.php';

// I have no idea if your config file is in /config/web.php
// or in /env/dev/config/web.php so you need to adjust this as needed.
$config = require $path . '/config/web.php'; 

try {
    (new yii\web\Application($config))->run();
} catch (yii\base\InvalidConfigException $exception) {
    echo $exception->getMessage();
}