Skip to content

How to set values into core_config_data with module setup (Area code is not set) #2788

@bka

Description

@bka

Hi all,

I'm looking for a way to set some configuration values with an InstallData.php script inside a custom module. My current approach to utilize \Magento\Config\Model\Config doesn't seem to work:

public function __construct(\Magento\Config\Model\Config $config, \Magento\Theme\Model\ResourceModel\Theme\CollectionFactory $themeResourceFactory){
  ...
}

When executing bin/magento setup:upgrade it fails with Area code is not set. The underlying issue seems to be that \Magento\Config\Model\Config has a dependency to \Magento\Config\Model\Config\Structure which itself has a dependency to Magento\Config\Model\Config\Structure\Element\Section which depends on a \Magento\Framework\AuthorizationInterface. So it tries to start a new session inside SessionManager.php and obviously dies because Area code is not set.

[Magento\Framework\Exception\LocalizedException]  
Area code is not set                              
Exception trace:
() at /docker/Source/lib/internal/Magento/Framework/App/State.php:139
Magento\Framework\App\State->getAreaCode() at /docker/Source/lib/internal/Magento/Framework/Session/SessionManager.php:173
Magento\Framework\Session\SessionManager->start() at /docker/Source/lib/internal/Magento/Framework/Session/SessionManager.php:130
Magento\Framework\Session\SessionManager->__construct() at /docker/Source/app/code/Magento/Backend/Model/Auth/Session.php:98
Magento\Backend\Model\Auth\Session->__construct() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:148
Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:89
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
Magento\Framework\ObjectManager\ObjectManager->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:238
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
Magento\Framework\ObjectManager\ObjectManager->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:238
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
Magento\Framework\ObjectManager\ObjectManager->get() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
Magento\Framework\ObjectManager\ObjectManager->create() at /docker/Source/app/code/BOS/Setup/Setup/InstallData.php:19
BOS\Setup\Setup\InstallData->__construct() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:97
Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:89
Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() at /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
Magento\Framework\ObjectManager\ObjectManager->create() at /docker/Source/setup/src/Magento/Setup/Model/Installer.php:867
Magento\Setup\Model\Installer->createSchemaDataHandler() at /docker/Source/setup/src/Magento/Setup/Model/Installer.php:1171
Magento\Setup\Model\Installer->getSchemaDataHandler() at /docker/Source/setup/src/Magento/Setup/Model/Installer.php:795
Magento\Setup\Model\Installer->handleDBSchemaData() at /docker/Source/setup/src/Magento/Setup/Model/Installer.php:746
Magento\Setup\Model\Installer->installDataFixtures() at /docker/Source/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php:72
Magento\Setup\Console\Command\UpgradeCommand->execute() at /docker/Source/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:257
Symfony\Component\Console\Command\Command->run() at /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:874
Symfony\Component\Console\Application->doRunCommand() at /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:195
Symfony\Component\Console\Application->doRun() at /docker/Source/lib/internal/Magento/Framework/Console/Cli.php:49
Magento\Framework\Console\Cli->doRun() at /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:126
Symfony\Component\Console\Application->run() at /docker/Source/bin/magento:25

I also tried \Magento\Setup\Model\ConfigModel, but this fails as well.

PHP Fatal error:  Cannot instantiate interface Zend\ServiceManager\ServiceLocatorInterface in /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 73
PHP Stack trace:
PHP   1. {main}() /docker/Source/bin/magento:0
PHP   2. Symfony\Component\Console\Application->run() /docker/Source/bin/magento:25
PHP   3. Magento\Framework\Console\Cli->doRun() /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:126
PHP   4. Symfony\Component\Console\Application->doRun() /docker/Source/lib/internal/Magento/Framework/Console/Cli.php:49
PHP   5. Symfony\Component\Console\Application->doRunCommand() /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:195
PHP   6. Symfony\Component\Console\Command\Command->run() /docker/Source/vendor/symfony/console/Symfony/Component/Console/Application.php:874
PHP   7. Magento\Setup\Console\Command\UpgradeCommand->execute() /docker/Source/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:257
PHP   8. Magento\Setup\Model\Installer->installDataFixtures() /docker/Source/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php:72
PHP   9. Magento\Setup\Model\Installer->handleDBSchemaData() /docker/Source/setup/src/Magento/Setup/Model/Installer.php:746
PHP  10. Magento\Setup\Model\Installer->getSchemaDataHandler() /docker/Source/setup/src/Magento/Setup/Model/Installer.php:795
PHP  11. Magento\Setup\Model\Installer->createSchemaDataHandler() /docker/Source/setup/src/Magento/Setup/Model/Installer.php:1171
PHP  12. Magento\Framework\ObjectManager\ObjectManager->create() /docker/Source/setup/src/Magento/Setup/Model/Installer.php:867
PHP  13. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
PHP  14. Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:89
PHP  15. BOS\Setup\Setup\InstallData->__construct() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:97
PHP  16. Magento\Framework\ObjectManager\ObjectManager->create() /docker/Source/app/code/BOS/Setup/Setup/InstallData.php:19
PHP  17. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:57
PHP  18. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
PHP  19. Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
PHP  20. Magento\Framework\ObjectManager\ObjectManager->get() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
PHP  21. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
PHP  22. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
PHP  23. Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
PHP  24. Magento\Framework\ObjectManager\ObjectManager->get() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
PHP  25. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71
PHP  26. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:82
PHP  27. Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php:53
PHP  28. Magento\Framework\ObjectManager\ObjectManager->get() /docker/Source/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:236
PHP  29. Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create() /docker/Source/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php:71

So what is the preferred way to set some config values like currency/options/base? Is it really necessary to have a dependency to the Auth/Session.php? What would be a proper solution?

I also accidentally discovered that I could work around this by sending some output e.g. having a registration.php with one empty line which causes isSessionExists to return true because
headers_sent is 1.

public function isSessionExists()
{
    if (session_status() === PHP_SESSION_NONE && !headers_sent()) {
        return false;
    }
    return true;
}

Everything works fine under these circumstances because SessionManager.php:start does not run into getAreaCode() because it thinks a session already exists.

public function start()
{
    if (!$this->isSessionExists()) {
        \Magento\Framework\Profiler::start('session_start');

        try {
            $this->appState->getAreaCode();

    ...

But this was obviously not intendent. Is there maybe a way to deactivate Session/Authenticate for setup tasks or am I on the wrong track? Any hints are welcome.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions