web-dev-qa-db-ja.com

アクティブな構成から構成オブジェクトを削除するにはどうすればよいですか?

Drupal 8.のカスタムモジュールを作成しています。これは、modules/mymod/config/install/field.storage.bloom_stem.bs_Twitter_ac.ymlというファイルでフィールドストレージ構成オブジェクトを定義します。

問題は、モジュールをアンインストールしても削除されないことです。モジュールを再インストールするとクラッシュするので、明らかに取り残されています。

drush -y pm-uninstall mymod
drush cr
drush -y en mymod

例外「Drupal\Core\Config\PreExistingConfigException」とメッセージ「mymodによって提供された構成オブジェクト(field.storage.bloom_stem.bs_Twitter_ac)はすでにアクティブな構成に存在します」

したがって、この構成オブジェクトを手動で削除する必要があるようです。モジュールがアンインストールされるときにそれを削除するいくつかの追加のコードを提供する必要がありますか?

43
artfulrobot

現時点でこれを行う最も簡単な方法は、drush php(またはcore-cli)インタラクティブセッションを開きます。

次に使用します:

Drupal::configFactory()->getEditable('system.menu.devel')->delete();

この機能はDrupalコンソール にも追加されます。

55
lexicant

設定オブジェクトを削除するためのDrushコマンド:drush config-delete <config_name>

33
ya.teck

次の方法を使用できます。 hook_uninstallで次のコードを使用します

Drupal::configFactory()->reset('field.storage.bloom_stem.bs_Twitter_ac');

OR

ymlファイルに次のような依存関係を置くことができます


dependencies:
  module:
    - yourmodule
  enforced:
    module:
      - yourmodule

次にdrupalは、Berdirの説明に従ってモジュールをアンインストールすると、この構成を自動的に削除します https://drupal.stackexchange.com/a/173879/10436

14
Ahmad

drupal console を使用:

$ drupal config:delete 'the_config_to_delete'
9
VincentLalieu

Drupal :: configFactory()-> reset()は設定オブジェクトを削除しません。この実行のためにDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()

7
balagan

構成アイテムを削除するために使用できる簡単なモジュールを作成しました。

https://www.drupal.org/project/config_delete

3
gnikolovski

カスタムモジュールからアクティブ構成をアンインストール

カスタムモジュールから構成ファイルをアンインストールしようとすると、同じ問題が発生しました。 Webformのカスタム構成ファイルを渡すために使用されるカスタムモジュールがあります。私は完璧ではないので、モジュールをアンインストールし、コードを編集して再インストールできるようにしたいと思っています。 config/install ymlファイルのdependency/enforcedセクションでカスタムモジュール(my_module)を参照した場合、モジュールをアンインストールすると、構成ファイルもアンインストールされます。

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here

Drupalコンソールを使用して、drupal config:delete active config_to_delete

2
Umed Godd

drush config-listを使用してリストされたすべての構成を検索し、削除する構成を特定します。以下のコマンドを使用して構成を削除しますdrush config-delete

1
Manikanta

モジュールがアンインストールされたときに、設定を削除するには hook_uninstall を使用します。

次に、構成を削除します。

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
0
user72672

私はここに小さな(まだ少しオーバーエンジニアリングされた)Pythonスクリプトを残して、残りの構成を削除します。これはdrush config-deleteに依存しています。

# 'batch_config_delete.py'
# 'drush' has to be available in the current directory

import os
import argparse
import subprocess

MODULES_ROOT = "/var/www/html/MYSITE/web/modules/custom"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Batch config delete.")
    parser.add_argument("-m", "--module", required=True, help="Module name")
    args = parser.parse_args()
    install_path = os.path.join(MODULES_ROOT, args.module, 'config/install')

    for f in os.listdir(install_path):
        if f.endswith('.yml'):
            config_name = os.path.splitext(f)[0]
            print "Delete config:", config_name
            subprocess.call(['drush', 'config-delete', config_name])

このように実行する必要があります:

python ../scripts/batch_config_delete.py -m foobar
0
turdus-merula

これらすべての回答では、基になる構成オブジェクトを直接削除することを推奨していますが、正しい方法は、エンティティストレージシステムを介してエンティティを削除することです。

たとえば、ID「大」の画像スタイルがあり、それを削除する場合は、次のようにします。

\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();

このようにすると、コアは、構成が削除される前に「削除前」を、構成が削除された後に「削除」フックを呼び出します。他のモジュールは、さまざまなクリーンアップ操作の実行に依存する場合があります。

0
Brian

Easy Install module を使用して、この構成の問題を回避します。このモジュールは、モジュールのアンインストール中に構成を削除することを許可します。モジュールの構成にenforcedyml内、またはoptionalフォルダー内の構成が追加されていません。

Configuration on uninstallation image

以下のようにdrush config:deleteコマンドを使用してアクティブな構成を削除できますdrush cdel "name of the config"たとえば、私の場合はdrush cdel dtn_Apple_news.setting

これを実行した後、構成が削除されてからdrush en-y "module name"インストールするモジュールを取得しました。

0
Tejas Shah