Answers:
我不会使用模型或资源模型,但会使用(\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
。
您也可以使用\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
更简单易用
为了进行高级抽象,我将注入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
这里是一个完整的示例,以编程方式处理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);
}
@api
标记的答案出现在顶部。