Magento 2: Programmgesteuertes Hinzufügen eines Werts zu "core_config_data"

24

Verfügt Magento 2 über eine übergeordnete Abstraktion, mit der Endbenutzerprogrammierer Konfigurationswerte in der core_config_dataTabelle aktualisieren können ? Oder ist gerade SQL die einzige Möglichkeit, dies in Magento 2 zu tun?

dh in Magento 1 könnten Sie so etwas tun

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

und speichern Sie die Konfigurationswerte in core_config_data. Gibt es in Magento 2 ein Äquivalent?

Alan Storm
quelle

Antworten:

18

Ich würde kein Modell oder Ressourcenmodell verwenden, aber \Magento\Framework\App\Config\Storage\WriterInterfaceoder \Magento\Framework\App\Config\ConfigResource\ConfigInterface(die erste Delegierung an die zweite).

Ganz einfach auch:

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

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}
vergiss es
quelle
Vielen Dank! Ich denke, dies ist der bessere Ansatz / die bessere Abstraktion, die wir verwenden sollten. Da \Magento\Framework\App\Config\Storage\WriterInterfacewird umgesetzt \Magento\Framework\App\Config\Storage\Writerwas wiederum nutzt \Magento\Config\Model\ResourceModel\Config.
Andrei
4

Sie können auch verwenden \Magento\Config\Model\Config::save. Unten ein einfaches Beispiel:

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

Diese Syntax ist nicht "einfach", aber in manchen Fällen sicherer. Aufgrund der Speicherlogik ist die Aktion möglicherweise langsamer als der direkte Zugriff auf die Datenbank.

In meinem Fall $valuemuss verschlüsselt werden. In habe system.xmlich das Backend-Modell für das Feld festgelegt und die Sicherungslogik verschlüsselt die Daten.

Bearbeiten: \Magento\Config\Model\Config::setDataByPatheinfacher zu bedienen

bchatard
quelle
4

Für eine Abstraktion auf hoher Ebene würde ich Magento\Framework\App\Config\Storage\WriterInterfacein den Konstruktor eines Daten-Setup-Skripts einfügen:

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

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

Dann verwenden Sie die save()Methode, zum Beispiel:

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

Anmerkungen: Verwenden Sie die Pluralform der Bereiche: Websites / Stores in Magento\Store\Model\ScopeInterface

William Tran
quelle
0

Hier ein vollständiges Beispiel für die programmgesteuerte Verwaltung der Magento 2-Konfiguration.

In meinem Fall füge ich hinzu, um den Cache zu leeren . Andernfalls werden die Änderungen nicht in Store> Config angezeigt .

/**
 * @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
quelle