Решил поделиться отлаженной и удобной для меня схемой подключения файлов настроек (папка /config), которую я использую во всех своих проектах на yii 2 basic.

Суть


Свою идею я хочу продемонстрировать на примере папки /config одного из моих текущих проектов:
  • bootstrap.php — «Предпусковые» настройки для окружения.
  • bootstrap.local.php — «Предпусковые» настройки для локального сервера.
  • defaults.php — Настройки по умолчанию окружения.
  • defaults.local.php — Настройки по умолчанию локального сервера.
  • defaults.local.example — Образец настроек, чтобы можно было быстрее создать настройки локального сервера.
  • console.php — Настройки консоли окружения.
  • web.php — Настройки web приложения окружения.
  • .gitignore — Правила игнорирования локальных настроек при работе с git репозитарием.

Как видно из структуры файлов, настройки разделяются на локальные и настройки окружения. Настройки окружения обычно выступают в роли настроек боевого сервера, так как именно боевой сервер и является окружением: к нему подключаются разработчики, он отвечает за вывод сайта и так далее.

Описание


Подключение настроек начинается с файла /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');
require __DIR__ . '/../config/bootstrap.php';

// сливаем многомерные массивы
$config = \yii\helpers\ArrayHelper::merge(
	require __DIR__ . '/../config/defaults.php', // многомерный массив настроек по умолчанию
	require __DIR__ . '/../config/web.php' // многомерный массив настроек веб окружения
);

(new yii\web\Application($config))->run();

Файл /config/bootstrap.php отвечает за «предпусковые» настройки окружения
<?php

// настройки локальной машины
$path_local = __DIR__ . '/bootstrap.local.php';
if(file_exists($path_local)) {
	require $path_local;
}

Как видно из участка кода, полезной информации в файле обычно нет, но в нем присутствует код отвечающий за проверку и подключение локальных файлов. Такой подход позволяет не беспокоится о наличии этих файлов.

Файл /config/bootstrap.local.php отвечает за «предпусковые» настройки для локального сервера:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

Файл /config/defaults.php отвечает за настройки окружения по умолчанию и обычно содержит настройки подключения к базе данных и другие глобальные настройки приложения (из файла были убраны некоторые настройки для наглядности):

<?php
$defaults = [
	'basePath' => dirname(__DIR__),
	'timeZone' => 'UTC',

	'components' => [
		'db' => [
			'class' => 'yii\db\Connection',
			'dsn' => 'mysql:host=localhost;dbname=webulla',
			'username' => 'webulla',
			'password' => 'password',
			'charset' => 'utf8',
			'tablePrefix' => '',
			'enableSchemaCache' => true,
			'enableQueryCache' => true,
		],
	],
];

// настройки локальной машины
$path_local = __DIR__ . '/defaults.local.php';
if(file_exists($path_local)) {
	$defaults = \yii\helpers\ArrayHelper::merge($defaults, require $path_local);
}

return $defaults;

Файл /config/defaults.local.php отвечает за настройки локального сервера по умолчанию и переопределяет настройки подключения к базе данных:

<?php

return [
	'components' => [
		'db' => [
			'dsn' => 'mysql:host=localhost;dbname=webulla',
			'username' => 'root',
			'password' => '',
		]
	],
];

На примере файлов /config/defaults.php и /config/defaults.local.php настраиваются файлы настроек консоли и веб окружения.

Файл /config/.gitignore отвечает то, чтобы локальные настройки не вылились на сервер:

# ignore local configs
*.local.php

Заключение


Такой подход позволяет мне просто и быстро править настройки на локальном и боевом сервере. При использовании git репозитария это еще больше упрощает жизнь: не нужно беспокоиться о том, что какие-то локальные настройки улетят на сервер.

Комментарии (9)


  1. AlexLeonov
    18.08.2015 11:47

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

    На верном пути, товарищ )))


    1. SamDark
      18.08.2015 13:51
      +4

      Оно есть в advanced ;)


  1. oknimdy
    18.08.2015 16:35
    -2

    что за бред настройки СЕРВЕРА класть в репозиторий


    1. AlexLeonov
      18.08.2015 17:40

      Не настройки СЕРВЕРА, а настройки ОКРУЖЕНИЯ приложения.

      Вот вы как решаете проблему добавления в кронтаб еще одного задания? Неужели не храните файлик crontab в гите? Если же нет — как тогда раскладываете по стендам?


      1. oknimdy
        18.08.2015 19:21

        я настройки подключений, всякие секреты апи и прочее не храню в конфигах окружения, те что попадают в репозиторий, для этого есть специальные local файлы


      1. macseem_327
        25.08.2015 14:44

        Для кронтабов и прочего есть ansible/docker в зависимости от задачи.
        Я обычно храню настройки и конфиги сервера в прод репозитории конфигов, который клонируется рядом с проектом и ссылается на него симлинкой из проекта.
        Да, приходится возиться с синхронизацией дев и прод репозиториев конфигов, но зато это безопасно и ты не думаешь, что забыл какой-то конфиг сделать, чтобы приложение запустить.


  1. zein
    18.08.2015 16:55

    Рано или поздно все мы приходим к этому:
    The Twelve Factor App: Конфигурация

    ну ведь удобно же — просто попробуйте.


  1. khorpyakov
    18.08.2015 18:17
    -1

    Дилетантский вопрос. А в docker это нельзя упаковать?


  1. nogoody
    18.08.2015 18:19
    +1

    Ну в общем да, изобрели для basic версии то, что уже есть в advanced