Один из альтернативных и наиболее удобных способов организовать настройку environment в yii2 – это воспользоваться пакетом https://github.com/vlucas/phpdotenv
Он удобен тем, что хранит все параметры (изменяемые, в зависимости от окружения) в одном маленьком файле .env, с простым и понятным синтаксисом.
Посути, это реализация на PHP аналогичного пакета для Ruby. https://github.com/vlucas/phpdotenv
Итак, как же будет организована настройка параметров окружения, при использовании phpdotenv? Далее я постараюсь это наглядно показать:
Конечно, для начала нужно установить пакет phpdotenv через composer:
1 |
composer require vlucas/phpdotenv |
Сам файл с настройками можно создать в корневом каталоге сайта:
.env – файл который не хранится в git, и содержит специальные настройки под конкретное окружение
.env.example – практически файл-копия .env, но который хранится в git, не используется в приложении и содержит лишь возможные примерные настройки, служит как подсказка для разработчиков, чтобы они знали как настроить окружение, а именно, сосздать себе свой .env файл.
Пример файла .env.example:
1 2 3 4 5 6 7 8 9 10 11 12 |
YII_DEBUG=true YII_ENV=dev COOKIE_VALIDATION_KEY=svbfj;gsdbgdvnhdfgghcxbn-1qwe # For sqlite # DB_DSN=sqlite:/runtime/site.db # Mysql config DB_NAME=dbname DB_USERNAME=dbuser DB_PASSWORD=dbpassword |
Поскольку пакет был поставлен через composer, его классы уже доступны в index.php после строчки
1 |
require(__DIR__ . '/../vendor/autoload.php'); |
В index.php надо внести незначительные изменения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../helpers/helpers.php'); Dotenv::load(__DIR__ . '/../'); // comment out the following two lines when deployed to production defined('YII_DEBUG') or define('YII_DEBUG', env('YII_DEBUG')); defined('YII_ENV') or define('YII_ENV', env('YII_ENV')); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); (new yii\web\Application($config))->run(); |
Для удобства работы с пакетом был также добавлен хелпер с процедурными фунциями, но главная из них env().
Сам файл: helpers.php
Его следует поместить в папку helpers/ (создать её, если нету)
В index.php этот файл подключается так:
1 |
require(__DIR__ . '/../helpers/helpers.php'); |
Эта строчка:
1 |
Dotenv::load(__DIR__ . '/../'); |
загружает в переменные $_ENV, $_SERVER все данные из файла .env в указанной директории. Но имя файла можно задать и другое (Смотрите документацию к пакету):
env('YII_DEBUG')
– Извлекает данные из ключа YII_DEBUG (который задан в .env)
Таким образом можно прописать все необходимые, изменяемые в зависимости от окружения параметры, в конфигурационных файлах фреймворка.
Вот пример, как будет выглядеть config/db.php:
1 2 3 4 5 6 7 8 9 10 |
<?php return [ 'class' => 'yii\db\Connection', // 'dsn' => env('DB_DSN', 'sqlite:/path/to/database/file'), 'dsn' => 'mysql:host=' . env('DB_HOST', 'localhost') . ';dbname=' . env('DB_NAME', 'kamin_cinema'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'), 'charset' => 'utf8', ]; |
env('DB_USERNAME', 'root')
– Второй параметр выводится по умолчанию, если вдруг в .env не указана такая переменная окружения.
Аналогичным образом изменяется и файл yii, для запуска консольного приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/usr/bin/env php <?php /** * Yii console bootstrap file. * * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ require(__DIR__ . '/vendor/autoload.php'); require(__DIR__ . '/helpers/helpers.php'); Dotenv::load(__DIR__ . '/'); defined('YII_DEBUG') or define('YII_DEBUG', env('YII_DEBUG')); // fcgi doesn't have STDIN and STDOUT defined by default defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w')); require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/config/console.php'); $application = new yii\console\Application($config); $exitCode = $application->run(); exit($exitCode); |
Правки совсем небольшие, просто добавлено две строчки, и указано, откуда брать значение для YII_DEBUG.
На этом все.
Просмотров : 17853
А ничего страшного что это файл и при каждой загрузке будет читаться с диска, в то время как текущий вариант конфигов, в обычный php файл, будет закеширован в OPcache. Я уже молчу про наследование и переопределение базовых настроек.
ЗЫ Ещё одна поделка успешно стыреная у Ruby-стов.
Сразу видно что вы никогда не имели дело с Capistrano и деплоем на несколько серверов. В этом случае данная технология очень удобна.
А наследование конфигов – это самая ужасная мерзость которая только есть:)
Какое преимущество по сравнению с 1 таким же php файлом ввиде масива который затем так же с успехом быть запихан в evn и пр.? А вот постоянное дерганье файловой системы надеясь только на ее кеширование это просадка и для нагруженного проекта непойдет.
Согласен с dmitry. Наследование – это ад, + плодятся много лишних файлов . Данное решение весьма изящно и реально удобно для git. Менять нужно всего один файл в случае локального разворачивания, круто, респект
Имейте один php файл какая разница?
or: Uncaught Error: Class ‘Dotenv’ not found
$dotenv = new Dotenv\Dotenv(“../”);
$dotenv->load();
Спасибо, очень полезный пакет!
Но я в index.php добавил
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . ‘/../’);
$dotenv->load();
(взял в описании с github’а)