Source configuration values fallback mechanism, by highest priority

  • environment variables (Magento Cloud)
  • app/etc/env.php
  • app/etc/config.php
  • core_config_data database table
  • config.xml module files

Configuration values fallback mechanism, by highest priority

  • Store view
  • Website
  • Default
  • System

Config values are fully loaded from each sources then merged by priority


Let’s take an example with the number of product per page in a grid mode on category pages. Config path is catalog/frontend/grid_per_page_values

1- environment variables (Magento Cloud)

Theses variables are set via the project web interface.
Pattern name is: env:CONFIG__[STORE]__[XML_PATH]
In our case it will be: env:CONFIG__DEFAULT__CATALOG__FRONTEND__GRID_PER_PAGE_VALUES

Or in .magento.app.yaml
variables:
    env:
       CONFIG__DEFAULT__PAYPAL_ONBOARDING__MIDDLEMAN_DOMAIN: ‘payment-broker.magento.com’
       CONFIG__STORES__DEFAULT__PAYPAL__NOTATION_CODE: ‘Magento_Enterprise_Cloud’

Magento DevDoc

2- env.php & config.php files

Driven by Magento\Framework\App\Config\InitialConfigSource

Values can be generated with app:config:dump system cli or manually added in files
Magento DevDoc

Example:

These configuration values will be locked, you wont be able to edit them from admin panel.
If you want to update a value in these files, you’ll have to:

  • edit the file
  • or remove it from the file to unlock it

3- core_config_data table

Driven by Magento\Config\App\Config\Source\RuntimeConfigSource

If config value was not found in previous step, then a look is made inside core_config_data table.
Config values are populated in this table when saving config form (driven by system.xml files) from admin panel in Stores > Configuration sections.

4- config.xml files

Driven by Magento\Config\App\Config\Source\ModularConfigSource

Finally if config was not found in core_config_data neither, configuration value is loaded from config.xml module file.

Good to know

Config importer pool

There is a config importer pool: Magento\Deploy\Model\DeploymentConfig\ImporterPool

There are 3 importers by default:


invokeSave

At the end of setup:upgrade process, app:config:import will be executed.
The ChangeDetector will compare config values from env.php & config.php with those of the database.

If there are differences then the configurations that need to be updated from the files will be imported into the flag table in the system_config_snapshot row. A new hash will then be generated based on these new values in the config_hash row.

What is the purpose of values stored in system_config_snapshot row?
These values are not taken into account by Magento when building storefront configurations. They are only used by the ChangeDetector which will simulate a save of configuration values (only if config value has been updated) to run before and after save methods.


Convert php array config to xml path config