Magento 2: adicione um valor programaticamente a `core_config_data`

24

O Magento 2 possui uma abstração de alto nível que permite que os programadores do usuário final atualizem os valores de configuração na core_config_datatabela? Ou usar o SQL direto é a única maneira de fazer isso no Magento 2?

ou seja, no Magento 1, você poderia fazer algo assim

$config_model = new Mage_Core_Model_Config();
$config_model->saveConfig('my/config/path', $unique_id, 'default', 0);

e salve os valores de configuração core_config_data. Existe um equivalente no Magento 2?

Alan Storm
fonte

Respostas:

18

Eu não usaria um modelo ou um modelo de recursos, mas \Magento\Framework\App\Config\Storage\WriterInterfaceou \Magento\Framework\App\Config\ConfigResource\ConfigInterface(o primeiro a delegar no segundo).

Bem direto também:

use Magento\Framework\App\Config\Storage\WriterInterface;

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}
nevvermind
fonte
Obrigado! Eu acho que essa é a melhor abordagem / abstração de alto nível que devemos usar. Porque \Magento\Framework\App\Config\Storage\WriterInterfaceé implementado pelo \Magento\Framework\App\Config\Storage\Writerqual, por sua vez, usa \Magento\Config\Model\ResourceModel\Config.
Andrei
4

Você também pode usar \Magento\Config\Model\Config::save. Abaixo uma amostra simples:

$configData = [
    'section' => 'MY_SECTION',
    'website' => null,
    'store'   => null,
    'groups'  => [
        'MY_GROUP' => [
            'fields' => [
                'MY_FIELD' => [
                    'value' => $myValue,
                ],
            ],
        ],
    ],
];

// $this->configFactory --> \Magento\Config\Model\Config\Factory
/** @var \Magento\Config\Model\Config $configModel */
$configModel = $this->configFactory->create(['data' => $configData]);
$configModel->save();

Essa sintaxe não é "simples", mas é mais segura em alguns casos. Para a lógica de salvamento, a ação pode ser mais lenta que o acesso direto ao banco de dados.

No meu caso, $valueprecisa ser criptografado. Em system.xml, defino o modelo de back-end para o campo e a lógica de salvamento criptografa os dados.

Editar: \Magento\Config\Model\Config::setDataByPathmais simples de usar

bchatard
fonte
4

Para uma abstração de alto nível, eu injetaria Magento\Framework\App\Config\Storage\WriterInterfaceno construtor de um script de configuração de dados:

use Magento\Framework\App\Config\Storage\WriterInterface; 

public function __construct(WriterInterface $configWriter) {...}

Em seguida, use o save()método, por exemplo:

$website = $this->websiteRepository->get('main_website'); // inject Magento\Store\Model\WebsiteRepository;

$this->configWriter->save('general/country/default', 'US', ScopeInterface::SCOPE_WEBSITES, $website->getId()); // inject Magento\Store\Model\ScopeInterface;

Notas: Use a forma plural de escopos: sites / lojas em Magento\Store\Model\ScopeInterface

William Tran
fonte
0

Aqui está uma amostra completa para lidar com a configuração do Magento 2 programaticamente.

No meu caso, eu adiciono para limpar o cache também, caso contrário , as alterações não aparecem em Store> Config .

/**
 * @var \Magento\Config\Model\ResourceModel\Config
 */
protected $resourceConfig;

/**
 * @var \Magento\Framework\App\Cache\TypeListInterface
 */
protected $cacheTypeList;

public function __construct(
    \Magento\Config\Model\ResourceModel\Config $resourceConfig,
    \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
) {
    $this->resourceConfig = $resourceConfig;
    $this->cacheTypeList = $cacheTypeList;
}

public function process()
{
    $this->resourceConfig->saveConfig(
        'my/config/path',
        $unique_id,
        \Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT,
        0
    );
     $this->cacheTypeList->cleanType(\Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER);
}
Antoine Martin
fonte