Magento 2: программно добавить значение в `core_config_data`

24

Есть ли в 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?

Алан Сторм
источник

Ответы:

21

Есть тот же 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

Mage2.PRO
источник
+1 Полезно, спасибо! Я собираюсь на некоторое время оставить вопрос открытым, чтобы увидеть, будут ли @apiотмеченные ответы подниматься вверх.
Алан Сторм
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');
    }
}
nevvermind
источник
Благодарность! Я думаю, что это лучший подход / абстракция высокого уровня, которую мы должны использовать. Потому \Magento\Framework\App\Config\Storage\WriterInterfaceчто реализован, \Magento\Framework\App\Config\Storage\Writerкоторый в свою очередь использует \Magento\Config\Model\ResourceModel\Config.
Андрей
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более простой в использовании

bchatard
источник
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);
}
Антуан Мартин
источник