{"id":14966404,"url":"https://github.com/yiisoft/config","last_synced_at":"2025-05-09T00:03:36.098Z","repository":{"id":38823216,"uuid":"334290088","full_name":"yiisoft/config","owner":"yiisoft","description":"Configuration management","archived":false,"fork":false,"pushed_at":"2025-02-05T10:53:55.000Z","size":444,"stargazers_count":31,"open_issues_count":17,"forks_count":10,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-05-07T07:23:17.891Z","etag":null,"topics":["composer-plugin","config","hacktoberfest","yii3"],"latest_commit_sha":null,"homepage":"https://www.yiiframework.com/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yiisoft.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"open_collective":"yiisoft","github":["yiisoft"]}},"created_at":"2021-01-29T23:53:54.000Z","updated_at":"2025-02-05T10:53:57.000Z","dependencies_parsed_at":"2023-12-13T03:34:34.895Z","dependency_job_id":"6e371af8-f952-419f-b555-8aa00e71c9db","html_url":"https://github.com/yiisoft/config","commit_stats":{"total_commits":152,"total_committers":17,"mean_commits":8.941176470588236,"dds":0.7236842105263157,"last_synced_commit":"70101f58a41fc303207933598e6b63126df1f829"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":"yiisoft/package-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiisoft%2Fconfig","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiisoft%2Fconfig/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiisoft%2Fconfig/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiisoft%2Fconfig/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yiisoft","download_url":"https://codeload.github.com/yiisoft/config/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253102594,"owners_count":21854499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer-plugin","config","hacktoberfest","yii3"],"created_at":"2024-09-24T13:36:20.149Z","updated_at":"2025-05-09T00:03:36.020Z","avatar_url":"https://github.com/yiisoft.png","language":"PHP","funding_links":["https://opencollective.com/yiisoft","https://github.com/sponsors/yiisoft"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/yiisoft\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://yiisoft.github.io/docs/images/yii_logo.svg\" height=\"100px\" alt=\"Yii\"\u003e\n        \u003cimg src=\"docs/logo.png\" height=\"100px\" alt=\"Config\"\u003e\n    \u003c/a\u003e\n    \u003ch1 align=\"center\"\u003eYii Config\u003c/h1\u003e\n    \u003cbr\u003e\n\u003c/p\u003e\n\n[![Latest Stable Version](https://poser.pugx.org/yiisoft/config/v/stable)](https://packagist.org/packages/yiisoft/config)\n[![Total Downloads](https://poser.pugx.org/yiisoft/config/downloads)](https://packagist.org/packages/yiisoft/config)\n[![Build status](https://github.com/yiisoft/config/workflows/build/badge.svg)](https://github.com/yiisoft/config/actions)\n[![Code Coverage](https://codecov.io/gh/yiisoft/config/graph/badge.svg?token=V8gfhkSUoP)](https://codecov.io/gh/yiisoft/config)\n[![Mutation testing badge](https://img.shields.io/endpoint?style=flat\u0026url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fyiisoft%2Fconfig%2Fmaster)](https://dashboard.stryker-mutator.io/reports/github.com/yiisoft/config/master)\n[![static analysis](https://github.com/yiisoft/config/workflows/static%20analysis/badge.svg)](https://github.com/yiisoft/config/actions?query=workflow%3A%22static+analysis%22)\n[![type-coverage](https://shepherd.dev/github/yiisoft/config/coverage.svg)](https://shepherd.dev/github/yiisoft/config)\n\nThis [Composer](https://getcomposer.org) plugin provides assembling of configurations distributed with composer\npackages. It is implementing a plugin system which allows to provide the configuration needed to use a package directly when installing it to make it run out-of-the-box.\nThe package becomes a plugin holding both the code and its default configuration.\n\n## Requirements\n\n- PHP 8.1 or higher.\n- Composer 2.3 or higher.\n\n## Installation\n\n```shell\ncomposer require yiisoft/config\n```\n\n## How it works?\n\nThe package consist of two parts: Composer plugin and config loader.\n\nAfter composer updates its autoload file, and that happens after `dump-autoload`, `require`, `update` or `remove`,\nComposer plugin:\n\n- Scans installed packages for `config-plugin` extra option in their `composer.json`.\n- Writes a merge plan into `config/.merge-plan.php`. It includes configuration from each package `composer.json`.\n  \nIn the application entry point, usually `index.php`, we create an instance of config loader and require a configuration\nwe need:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n);\n\n$web = $config-\u003eget('web');\n```\n\nThe `web` in the above is a config group. The config loader obtains it runtime according to the merge plan.\nThe configuration consists of three layers that are loaded as follows:\n\n- Vendor configurations from each `vendor/package-name`. These provide default values.\n- Root package configurations from `config`. These may override vendor configurations.\n- Environment specific configurations from `config`. These may override root and vendor configurations.\n\n\u003e Please note that same named keys are not allowed within a configuration layer.\n\nWhen calling the `get()` method, if the configuration group does not exist, an `\\ErrorException` will be thrown.\nIf you are not sure that the configuration group exists, then use the `has()` method:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n);\n\nif ($config-\u003ehas('web')) {\n    $web = $config-\u003eget('web');\n}\n```\n\n## Config groups\n\nEach config group represents a set of configs that is merged into a single array. It is defined per package in\neach package `composer.json`:\n\n```json\n\"extra\": {\n    \"config-plugin\": {\n        \"params\": [\n            \"params.php\",\n            \"?params-local.php\"\n        ],\n        \"common\": \"common.php\",\n        \"web\": [\n            \"$common\",\n            \"web.php\",\n            \"../src/Modules/*/config/web.php\"\n        ],\n        \"other\": \"other.php\"\n    }\n}\n```\n\nIn the above example the mapping keys are config group names and the values are configuration files and references to other config groups.\nThe file paths are relative to the [source-directory](#source-directory), which by default is the path where `composer.json` is located.\n\n### Markers\n\n- `?` - marks optional files. Absence of files not marked with this marker will cause exception.\n\n    ```php\n    \"params\": [\n       \"params.php\",\n       \"?params-local.php\"\n    ]\n    ```\n\n  It's okay if `params-local.php` will not be found, but it's not okay if `params.php` will be absent.\n  \n- `*` - marks wildcard path. It means zero or more matches by wildcard mask.\n\n  ```php\n  \"web\": [\n     \"../src/Modules/*/config/web.php\"\n  ]\n  ```\n\n  It will collect all `web.php` in any sub-folders of `src/Modules/` in `config` folder.\n  However, if the configuration folder is packaged as part of the `PHAR` archive, the configuration\n  files will not be uploaded. In this case, you must explicitly specify each configuration file.\n\n- `$` - reference to another config by its group name.\n\n  ```php\n  \"params\": [\n     \"params.php\",\n     \"?params-local.php\"\n  ],\n  \"params-console\": [\n     \"$params\",\n     \"params-console.php\"\n  ],\n  \"params-web\": [\n     \"$params\",\n     \"params-web.php\"\n  ]\n  ```\n\n  The config groups `params-console` and `params-web` will both contain the config values from `params.php` and `params-local.php` additional to their own configuration values.\n\n***\n\nDefine your configs like the following:\n\n```php\nreturn [\n    'components' =\u003e [\n        'db' =\u003e [\n            'class' =\u003e \\my\\Db::class,\n            'name' =\u003e $params['db.name'],\n            'password' =\u003e $params['db.password'],\n        ],\n    ],\n];\n```\n\nA special variable `$params` is read from config (by default, group is named `params`).\n\n### Using custom group for `$params`\n\nBy default, `$params` variable is read from `params` group. You can customize the group name via constructor of `Config`:\n\n```php\n$config = new Config(\n    new ConfigPaths(__DIR__ . '/configs'),\n    null,\n    [],\n    'custom-params' // Group name for `$params`\n);\n```\n\nYou can pass `null` as `$params` group name. In this case `$params` will empty array.\n\n### Using sub-configs\n\nIn order to access a sub-config, use the following in your config:\n\n```php\n'routes' =\u003e $config-\u003eget('routes');\n```\n\n## Options\n\nA number of options is available both for Composer plugin and a config loader. Composer options are specified in\n`composer.json`:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n      \"source-directory\": \"config\"\n    },\n    \"config-plugin\": {\n        // ...\n    }\n}\n```\n\n### `source-directory`\n\nThe `source-directory` option specifies where to read the configs from for a package the option is specified for.\nIt is available for all packages, including the root package, which is typically an application.\nThe value is a path relative to where the `composer.json` file is located. The default value is an empty string.\n\nIf you change the source directory for the root package, don't forget to adjust configs path when creating\nan instance of `Config`. Usually that is `index.php`:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__), 'path/to/config/directory'),\n);\n\n$web = $config-\u003eget('web');\n```\n\n### `vendor-override-layer`\n\nThe `vendor-override-layer` option adds a sublayer to the vendor, which allocates packages that will override\nthe vendor's default configurations. This sublayer is located between the vendor and application layers.\n\nThis can be useful if you need to redefine default configurations even before the application layer. To do this,\nyou need to create your own package with configurations meant to override the default ones:\n\n```json\n\"name\": \"vendor-name/package-name\",\n\"extra\": {\n    \"config-plugin\": {\n        // ...\n    }\n}\n```\n\nAnd in the root file `composer.json` of your application, specify this package in the `vendor-override-layer` option:\n\n```json\n\"require\": {\n    \"vendor-name/package-name\": \"version\",\n    \"yiisoft/config\": \"version\"\n},\n\"extra\": {\n    \"config-plugin-options\": {\n        \"vendor-override-layer\": \"vendor-name/package-name\"\n    },\n    \"config-plugin\": {\n        // ...\n    }\n}\n```\n\nIn the same way, several packages can be added to this sublayer:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"vendor-override-layer\": [\n            \"vendor-name/package-1\",\n            \"vendor-name/package-2\"\n        ]\n    }\n}\n```\n\nYou can use wildcard pattern if there are too many packages:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"vendor-override-layer\": [\n            \"vendor-1/*\",\n            \"vendor-2/config-*\"\n        ]\n    }\n}\n```\n\nFor more information about the wildcard syntax, see the [yiisoft/strings](https://github.com/yiisoft/strings).\n\n\u003e Please note that in this sublayer keys with the same names are not allowed similar to other layers.\n\n### `merge-plan-file`\n\nThis option allows you to override path to merge plan file. It is `.merge-plan.php` by default. To change it, set the value:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"merge-plan-file\": \"custom/path/my-merge-plan.php\"\n    }\n}\n```\n\nThis can be useful when developing. Don't forget to set same path in `Config` constructor when changing this option.\n\n### `build-merge-plan`\n\nThe `build-merge-plan` option allows you to disable creation/updating of the `config/.merge-plan.php`.\nEnabled by default, to disable it, set the value to `false`:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"build-merge-plan\": false\n    }\n}\n```\n\nThis can be useful when developing. If the config package is a dependency of your package,\nand you do not need to create a merge plan file when developing your package.\nFor example, this is implemented in [yiisoft/yii-runner](https://github.com/yiisoft/yii-runner).\n\n### `package-types`\n\nThe `package-types` option define package types for process by composer plugin. By default, it is \"library\" and\n\"composer-plugin\". You can override default value by own types:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"package-types\": [\"library\", \"my-extension\"]\n    }\n}\n```\n\n## Environments\n\nThe plugin supports creating additional environments added to the base configuration. This allows you to create\nmultiple configurations for the application such as `production` and `development`.\n\n\u003e Note that environments are supported on application level only and are not read from configurations of packages.\n\nThe environments are specified in the `composer.json` file of your application:\n\n```json\n\"extra\": {\n    \"config-plugin-options\": {\n        \"source-directory\": \"config\"\n    },\n    \"config-plugin\": {\n        \"params\": \"params.php\",\n        \"web\": \"web.php\"\n    },\n    \"config-plugin-environments\": {\n        \"dev\": {\n            \"params\": \"dev/params.php\",\n            \"app\": [\n                \"$web\",\n                \"dev/app.php\"\n            ]\n        },\n        \"prod\": {\n            \"app\": \"prod/app.php\"\n        }\n    }\n}\n```\n\nConfiguration defines the merge process. One of the environments from `config-plugin-environments`\nis merged with the main configuration defined by `config-plugin`. In given example, in the `dev` environment\nwe use `$web` configuration from the main environment.\n\nThis configuration has the following structure:\n\n```\nconfig/             Configuration root directory.\n    dev/            Development environment files.\n        app.php     Development environment app group configuration.\n        params.php  Development environment parameters.\n    prod/           Production environment files.\n        app.php     Production environment app group configuration.\n    params.php      Main configuration parameters.\n    web.php         Мain configuration web group configuration.\n```\n\nTo choose an environment to be used you must specify its name when creating an instance of `Config`:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n);\n\n$app = $config-\u003eget('app');\n```\n\nIf defined in an environment, `params` will be merged with `params` from the main configuration,\nand could be used as `$params` in all configurations.\n\n## Configuration in a PHP file\n\nYou can define configuration in a PHP file. To do it, specify a PHP file path in the `extra` section of\nthe `composer.json`:\n\n```json\n\"extra\": {\n    \"config-plugin-file\": \"path/to/configuration/file.php\"\n}\n```\n\nConfigurations are specified in the same way, only in PHP format:\n\n```php\nreturn [\n    'config-plugin-options' =\u003e [\n        'source-directory' =\u003e 'config',  \n    ],\n    'config-plugin' =\u003e [\n        'params' =\u003e [\n            'params.php',\n            '?params-local.php',\n        ],\n        'web' =\u003e 'web.php', \n    ],\n    'config-plugin-environments' =\u003e [\n        'dev' =\u003e [\n            'params' =\u003e 'dev/params.php',\n            'app' =\u003e [\n                '$web',\n                'dev/app.php',\n            ],\n        ],\n        'prod' =\u003e [\n            'app' =\u003e 'prod/app.php',\n        ],\n    ],\n];\n```\n\nIf you specify the file path, the remaining sections (`config-plugin-*`) in `composer.json` will be ignored and\nconfigurations will be read from the PHP file specified. The path is relative to where the `composer.json` file\nis located.\n\n## Configuration modifiers\n\n### Recursive merge of arrays\n\nBy default, recursive merging of arrays in configuration files is not performed. If you want to recursively merge\narrays in a certain group of configs, such as params, you must pass `RecursiveMerge` modifier with specified\ngroup names to the `Config` constructor:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\nuse Yiisoft\\Config\\Modifier\\RecursiveMerge;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n    [\n        RecursiveMerge::groups('params', 'events', 'events-web', 'events-console'),\n    ],\n);\n\n$params = $config-\u003eget('params'); // merged recursively\n```\n\nIf you want to recursively merge arrays to a certain depth, use the `RecursiveMerge::groupsWithDepth()` method:\n\n```php\nRecursiveMerge::groups(['widgets-themes', 'my-custom-group'], 1)\n```\n\n\u003e Note: References to another configs use recursive modifier of root group.\n\n### Reverse merge of arrays\n\nResult of reverse merge is being ordered descending by data source. It is useful for merging module config with\nbase config where more specific config (i.e. module's) has more priority. One of such cases is merging events.\n\nTo enable reverse merge pass `ReverseMerge` modifier with specified group names to the `Config` constructor:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\nuse Yiisoft\\Config\\Modifier\\ReverseMerge;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n    [\n        ReverseMerge::groups('events', 'events-web', 'events-console'),\n    ],\n);\n\n$events = $config-\u003eget('events-console'); // merged reversed\n```\n\n\u003e Note: References to another configs use reverse modifier of root group.\n\n### Remove elements from vendor package configuration\n\nSometimes it is necessary to remove some elements of vendor packages configuration. To do this,\npass `RemoveFromVendor` modifier to the `Config` constructor.\n\nRemove specified key paths:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\nuse Yiisoft\\Config\\Modifier\\RemoveFromVendor;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n    [\n        // Remove elements `key-for-remove` and `nested→key→for-remove` from all groups in all vendor packages\n        RemoveFromVendor::keys(\n            ['key-for-remove'],\n            ['nested', 'key', 'for-remove'],\n        ),\n        \n        // Remove elements `a` and `b` from all groups in package `yiisoft/auth`\n        RemoveFromVendor::keys(['a'], ['b'])\n            -\u003epackage('yiisoft/auth'),\n        \n        // Remove elements `c` and `d` from groups `params` and `web` in package `yiisoft/view`\n        RemoveFromVendor::keys(['c'], ['d'])\n            -\u003epackage('yiisoft/view', 'params', 'web'),\n        \n        // Remove elements `e` and `f` from all groups in package `yiisoft/auth`\n        // and from groups `params` and `web` in package `yiisoft/view`\n        RemoveFromVendor::keys(['e'], ['f'])\n            -\u003epackage('yiisoft/auth')\n            -\u003epackage('yiisoft/view', 'params', 'web'),\n    ],\n);\n\n$params = $config-\u003eget('params');\n```\n\nRemove specified configuration groups:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\nuse Yiisoft\\Config\\Modifier\\RemoveFromVendor;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n    [\n        RemoveFromVendor::groups([\n            // Remove group `params` from all vendor packages\n            '*' =\u003e 'params',\n            \n            // Remove groups `common` and `web` from all vendor packages\n            '*' =\u003e ['common', 'web'],\n            \n            // Remove all groups from package `yiisoft/auth`\n            'yiisoft/auth' =\u003e '*',\n            \n            // Remove groups `params` from package `yiisoft/http`\n            'yiisoft/http' =\u003e 'params',\n            \n            // Remove groups `params` and `common` from package `yiisoft/view`\n            'yiisoft/view' =\u003e ['params', 'common'],\n        ]),\n    ],\n);\n```\n\n### Combine modifiers\n\n`Config` supports simultaneous use of several modifiers:\n\n```php\nuse Yiisoft\\Config\\Config;\nuse Yiisoft\\Config\\ConfigPaths;\nuse Yiisoft\\Config\\Modifier\\RecursiveMerge;\nuse Yiisoft\\Config\\Modifier\\RemoveFromVendor;\nuse Yiisoft\\Config\\Modifier\\ReverseMerge;\n\n$config = new Config(\n    new ConfigPaths(dirname(__DIR__)),\n    'dev',\n    [\n        RecursiveMerge::groups('params', 'events', 'events-web', 'events-console'),\n        ReverseMerge::groups('events', 'events-web', 'events-console'),\n        RemoveFromVendor::keys(\n            ['key-for-remove'],\n            ['nested', 'key', 'for-remove'],\n        ),\n    ],\n);\n```\n\n## Commands\n\n### `yii-config-copy`\n\nThe plugin adds extra `yii-config-copy` command to Composer. It copies the package config files from the vendor\nto the config directory of the root package:\n\n```shell\ncomposer yii-config-copy \u003cpackage-name\u003e [target-path] [files]\n```\n\nCopies all config files of the `yiisoft/view` package:\n\n```shell\n# To the `config` directory\ncomposer yii-config-copy yiisoft/view\n\n# To the `config/my/path` directory\ncomposer yii-config-copy yiisoft/view my/path\n```\n\nCopies the specified config files of the `yiisoft/view` package:\n\n```shell\n# To the `config` directory\ncomposer yii-config-copy yiisoft/view / params.php web.php\n\n# To the `config/my/path` directory and without the file extension\ncomposer yii-config-copy yiisoft/view my/path params web\n```\n\nIn order to avoid conflicts with file names, a prefix is added to the names of the copied files:\n`yiisoft-view-params.php`, `yiisoft-view-web.php`.\n\n### `yii-config-rebuild`\n\nThe `yii-config-rebuild` command updates merge plan file. This command may be used if you have added files or directories\nto the application configuration file structure and these were not specified in `composer.json` of the root package.\nIn this case you need to add to the information about new files to `composer.json` of the root package by executing the\ncommand:\n\n```shell\ncomposer yii-config-rebuild\n```\n\n### `yii-config-info`\n\nThe `yii-config-info` command displays application or package configuration details.\n\n```shell\ncomposer yii-config-info\ncomposer yii-config-info yiisoft/widget\n```\n\n## Documentation\n\n- [Internals](docs/internals.md)\n\nIf you need help or have a question, the [Yii Forum](https://forum.yiiframework.com/c/yii-3-0/63) is a good place for\nthat. You may also check out other [Yii Community Resources](https://www.yiiframework.com/community).\n\n## License\n\nThe Yii Config package is free software. It is released under the terms of the BSD License.\nPlease see [`LICENSE`](./LICENSE.md) for more information.\n\nMaintained by [Yii Software](https://www.yiiframework.com/).\n\n## Credits\n\nThe plugin is heavily inspired by [Composer config plugin](https://github.com/yiisoft/composer-config-plugin)\noriginally created by HiQDev (\u003chttps://hiqdev.com/\u003e) in 2016 and then adopted by Yii.\n\n## Support the project\n\n[![Open Collective](https://img.shields.io/badge/Open%20Collective-sponsor-7eadf1?logo=open%20collective\u0026logoColor=7eadf1\u0026labelColor=555555)](https://opencollective.com/yiisoft)\n\n## Follow updates\n\n[![Official website](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)](https://www.yiiframework.com/)\n[![Twitter](https://img.shields.io/badge/twitter-follow-1DA1F2?logo=twitter\u0026logoColor=1DA1F2\u0026labelColor=555555?style=flat)](https://twitter.com/yiiframework)\n[![Telegram](https://img.shields.io/badge/telegram-join-1DA1F2?style=flat\u0026logo=telegram)](https://t.me/yii3en)\n[![Facebook](https://img.shields.io/badge/facebook-join-1DA1F2?style=flat\u0026logo=facebook\u0026logoColor=ffffff)](https://www.facebook.com/groups/yiitalk)\n[![Slack](https://img.shields.io/badge/slack-join-1DA1F2?style=flat\u0026logo=slack)](https://yiiframework.com/go/slack)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyiisoft%2Fconfig","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyiisoft%2Fconfig","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyiisoft%2Fconfig/lists"}