Magento 2: Secara terprogram, Tambahkan Nilai ke `core_config_data`

24

Apakah Magento 2 memiliki abstraksi tingkat tinggi yang memungkinkan pemrogram-pengguna akhir untuk memperbarui nilai-nilai konfigurasi dalam core_config_datatabel? Atau menggunakan SQL langsung satu-satunya cara untuk melakukan ini di Magento 2?

yaitu di Magento 1, Anda bisa melakukan sesuatu seperti ini

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

dan simpan nilai konfigurasi ke core_config_data. Apakah ada yang setara di Magento 2?

Alan Storm
sumber

Jawaban:

18

Saya tidak akan menggunakan model atau model sumber daya, tetapi \Magento\Framework\App\Config\Storage\WriterInterfaceatau \Magento\Framework\App\Config\ConfigResource\ConfigInterface(delegasi pertama ke yang kedua).

Cukup lurus ke depan, juga:

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

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}
nevvermind
sumber
Terima kasih! Saya pikir ini adalah pendekatan yang lebih baik / abstraksi tingkat tinggi yang harus kita gunakan. Karena \Magento\Framework\App\Config\Storage\WriterInterfacediimplementasikan oleh \Magento\Framework\App\Config\Storage\Writeryang pada gilirannya menggunakan \Magento\Config\Model\ResourceModel\Config.
Andrei
4

Anda juga bisa menggunakan \Magento\Config\Model\Config::save. Di bawah contoh sederhana:

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

Sintaks ini tidak "sederhana", tetapi lebih aman untuk beberapa kasus. Karena menyimpan logika, tindakan mungkin lebih lambat daripada akses langsung ke db.

Dalam kasus saya, $valueperlu dienkripsi. Di system.xml, saya mengatur model backend untuk bidang, dan logika penyimpanan mengenkripsi data.

Sunting: \Magento\Config\Model\Config::setDataByPathlebih mudah digunakan

bchatard
sumber
4

Untuk abstraksi tingkat tinggi, saya akan menyuntikkan Magento\Framework\App\Config\Storage\WriterInterfaceke konstruktor skrip pengaturan data:

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

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

Kemudian gunakan save()metode tersebut, misalnya:

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

Catatan: Gunakan bentuk jamak lingkup: situs web / toko di Magento\Store\Model\ScopeInterface

William Tran
sumber
0

Di sini contoh lengkap untuk menangani konfigurasi Magento 2 secara terprogram.

Dalam kasus saya, saya menambahkan untuk menghapus cache juga, kalau tidak perubahan tidak muncul di 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);
}
Antoine Martin
sumber