По умолчанию 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. Они просто содержат общие настройки, исключая уникальные настройки,которые вы можете добавить в приложение, как обычно.