Magento 2: Программно добавьте значение в "данные конфигурации ядра`
Имеет ли Magento 2 абстракцию высокого уровня, которая позволяет программистам - конечным пользователям обновлять значения конфигурации в таблице 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?
5 answers
Существует такой же метод 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
(первое делегирование второму).
Тоже довольно прямолинейно:
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();
Этот синтаксис не "прост", но в некоторых случаях он более безопасен. В соответствии с логикой сохранения, действие может быть медленнее, чем прямой доступ к бд.
В моем случае $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.
В моем случае я также добавляю, чтобы очистить кэш, остальные изменения не отображаются в Хранилище > Конфигурация.
/**
* @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);
}