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


24

Magento 2是否具有允许最终用户程序员更新core_config_data表中的配置值的高级抽象?还是在Magento 2中使用直接SQL是唯一的方法?

即在Magento 1中,您可以执行以下操作

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

并将配置值保存到中core_config_data。Magento 2中有等同功能吗?

Answers:



18

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

也很简单:

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

class SomeClass {

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

谢谢!我认为这是我们应该使用的更好的方法/高级抽象。因为 \Magento\Framework\App\Config\Storage\WriterInterface\Magento\Framework\App\Config\Storage\Writer反过来使用实现的\Magento\Config\Model\ResourceModel\Config
Andrei

4

您也可以使用\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();

此语法不是“简单”的,但在某些情况下更安全。在保存逻辑上,操作可能比直接访问数据库要慢。

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

编辑:\Magento\Config\Model\Config::setDataByPath更简单易用


4

为了进行高级抽象,我将注入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


0

这里是一个完整的示例,以编程方式处理Magento 2配置。

就我而言,我也添加了清除缓存,否则更改不会出现在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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.