Magento 2:プログラムで「core_config_data」に値を追加する


24

Magento 2には、エンドユーザープログラマーがcore_config_dataテーブルの構成値を更新できる高レベルの抽象化がありますか?または、Magento 2でこれを行う唯一の方法はストレートSQLを使用していますか?

すなわち、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

+1役に立つ、ありがとう!質問をしばらく開いたままにして、@apiマークされた回答が一番上に表示されるかどうかを確認します。
アランストーム

18

モデルまたはリソースモデルを使用しませんが、\Magento\Framework\App\Config\Storage\WriterInterfaceまたは\Magento\Framework\App\Config\ConfigResource\ConfigInterface(最初に委任してから2番目に委任します)。

かなり簡単です:

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
アンドレイ

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

この構文は「単純」ではありませんが、場合によってはより安全です。保存ロジックとは異なり、アクションはdbへの直接アクセスよりも遅い場合があります。

私の場合、$value暗号化する必要があります。ではsystem.xml、フィールドのバックエンドモデルを設定し、保存ロジックがデータを暗号化します。

編集:\Magento\Config\Model\Config::setDataByPathより使いやすい


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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.