当前位置: 首页>>技术教程>>正文


Magento 2:以编程方式向“core_config_data”添加值

webfans 技术教程 , , , , 去评论

问题描述

Magento 2是否具有高级抽象,允许end-user-programmers更新core_config_data表中的配置值?或者使用直接SQL是在Magento 2中执行此操作的唯一方法?

即在Magento 1,你可以做这样的事情

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

并将配置值保存到core_config_data中。在Magento 2中是否有等同物?

最佳解决方法

有相同的saveConfig方法:https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Config/Model/ResourceModel/Config.php#L26-L61

核心的用法示例:https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Payment/Observer/UpdateOrderStatusForPaymentMethodsObserver.php#L59-L64

次佳解决方法

我不会使用模型或资源模型,而是使用\Magento\Framework\App\Config\Storage\WriterInterface\Magento\Framework\App\Config\ConfigResource\ConfigInterface(第一次委托给第二个)。

漂亮的straight-forward:

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

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}

第三种解决方法

您也可以使用\Magento\Config\Model\Config::save。以下简单示例:

$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();

这种语法不是”simple”,但在某些情况下它更安全。对于保存逻辑,操作可能比直接访问数据库慢。

就我而言,$value需要加密。在system.xml中,我为字段设置了后端模型,保存逻辑对数据进行加密。

编辑:\Magento\Config\Model\Config::setDataByPath使用起来更简单

第四种方法

对于高级抽象,我将Magento\Framework\App\Config\Storage\WriterInterface注入到数据设置脚本的构造函数中:

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

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

然后使用save()方法,例如:

$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;

注意:使用复数形式的范围:Magento\Store\Model\ScopeInterface中的网站/商店

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2481.html,转载请务必附带本地址声明。