По умолчанию main.файл конфигурации php для всех проектов в Yii2
Я разрабатываю несколько веб-сайтов на основе Yii2 framework, и мне было интересно, есть ли какой-либо хороший способ или даже хорошая идея или не создавать общую базовую конфигурацию .
причина этого в том, что все мои проекты основаны на одной и той же системе, имеют много общего, и я просто хочу сохранить вещи сухими. Конфигурации также в основном одинаковы - единственными различиями на самом деле являются имена баз данных и несколько других значений. Даже правила urlManager не так уж отличаются.
проблема в том, что, например, я хотел бы добавить дополнительные FileTarget
для целей регистратора для всех веб-сайтов я должен сделать это для каждого проекта отдельно, и я никогда не могу быть уверен, что все конфигурации проекта обновлены и все настроено правильно.
поэтому мне было интересно, есть ли способ создания файла конфигурации по умолчанию, общего в нескольких проектах, или это просто плохая идея. Например, я мог бы создать компонент bootstrap, который устанавливает значения по умолчанию или добавляет конфигурация по умолчанию как первый элемент в списке Объединенных конфигураций в . У меня есть частные пакеты, добавленные в composer, поэтому нет проблем с добавлением файла, который будет использоваться во всех проектах.
3 ответов
в качестве более простой альтернативы вы можете просто поместить файл куда-нибудь и включить его из всех конфигураций, т. е.
$commonConfig = require '/var/www/common/config.php';
$appConfig = require 'configs/main.php';
$config = array_merge($commonConfig, $appConfig);
// ...
Я работаю над одним и тем же вопросом довольно долго и пробовал несколько идей.
на данный момент я разработал хорошее решение для проблем, которые вы описали. Сердце решения hiqdev / composer-config-plugin - плагин composer, который объединяет конфигурации из расширений.
например у нас есть расширение, которое является базой для всех наших веб-проектов hiqdev / hisite-core он содержит базовое приложение Yii config и params:
return [
'id' => 'hisite',
'name' => 'HiSite',
'aliases' => [
'@bower' => '@vendor/bower-asset',
...
эти конфигурации включены в композитор.в JSON С таких строк:
"extra": {
"config-plugin": {
"params": "src/config/params.php",
"hisite": "src/config/hisite.php"
}
},
и это все. Вам требуется hiqdev / hisite-core, и после запуска обновления composer вы собрали конфигурации (у вас может быть несколько конфигураций) в vendor/hiqdev/config/hisite.в PHP
затем вы используете его из своего индекса.php такой:
$config = require dirname(dirname(__DIR__)) . '/hiqdev/config/hisite.php';
вы можете добиться аналогичного поведения с загрузкой расширения Yii, но загрузчик должен работать при каждом запросе страницы.
красота решения заключается в том, что у вас может быть много компонентов, каждый из которых предоставляет собственную часть конфигурации, и он работает без замедления времени рендеринга страницы, потому что конфигурация объединяется один раз при установке/обновлении composer. (И вы можете принудительно объединить config с Composer dump-autoload, не забудьте запустить его после изменения config).
используя этот метод мы создаем автоматические затыкая расширения: темы, модули и больше того, что не требуется настраивать в main config - вы просто требуете их в composer.json и у вас это работает.
это решение все еще работает, и оно будет развиваться и меняться, но мы используем его для действительно большого приложения на основе Yii2 с 30+ расширениями, и оно уже протестировано и достаточно стабильно.
что я решил создать ConfigHelper
класс, который помогает объединять локальные конфигурации с глобальными. Я публикую его только для того, чтобы другие люди увидели идею. Это может быть не решение utlimate, но оно работало с моей существующей настройкой.
на ConfigHelper
вместе с конфигурационными файлами по умолчанию включены в один из пакетов (частный репозиторий), который я включаю во все мои проекты на основе yii2 с помощью composer.
и теперь вместо стандартного fronted/web/index.php
конфиг слияние с шаблоном коде с Yii2:
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
Я использую свой вспомогательный класс:
$config = ConfigHelper::build(
__DIR__ . '/../..', //project root path
ConfigHelper::TIER_FRONTEND, // fronted, console or backend
'my-unique-app-name', //could be any other param that you need
);
$application = new yii\web\Application($config);
$application->run();
вспомогательный класс, который также имеет конфиги по умолчанию в файлах рядом с ним:
class ConfigHelper
{
const TIER_FRONTEND = 'frontend';
const TIER_CONSOLE = 'console';
const TIER_BACKEND = 'backend';
public static function build($root, $tier, $website)
{
// Notice that local files are included so in case they don't exist there won't be errors
return ArrayHelper::merge(
require(__DIR__ . "/../config/common/main.php"), // global basic config file for all projects
require("{$root}/common/config/main.php"),
include("{$root}/common/config/main-local.php"),
require(__DIR__ . "/../config/{$tier}/main.php"), // global basic config file for all projects
require("{$root}/{$tier}/config/main.php"),
include("{$root}/{$tier}/config/main-local.php")
);
}
}
глобальные файлы конфигурации по умолчанию такие же, как те, которые используются в Yii2. Они просто содержат общие настройки, исключая уникальные настройки,которые вы можете добавить в приложение, как обычно.