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


41

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)は既にアクティブな構成に存在しています'

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


同様の問題のようになります。drupal.stackexchange.com/questions/173684/...
othermachines

Easy Installモジュールは、この問題を完全に修正および回避するためにありますdrupal.org/project/easy_install
Karthikeyan Manivasagam

回答:


53

現時点でこれを行う最も簡単な方法は、drush php(またはcore-cli)を使用して対話型セッションを開くことです。

次に使用します:

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

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


1
これで問題は完全に解決しました。「system.menu.devel」を「the_setting.you.want.to.delete」に変更します
Eric

複数の構成を削除するのはどうですか?例migrate_plus.migration.*
Nic

@Nicそれはかなりありませんが、複数削除するには、あなたの他の質問に私の解決策をチェックアウト:drupal.stackexchange.com/questions/214132/...を
CR47

データベースに直接アクセスできる場合は、問題のエントリをconfigテーブルから慎重に削除してください。
Naidim 16

30

構成オブジェクトを削除するDrushコマンド:drush config-delete <config_name>


マルチサイトの場合drush -l your.site.domain config-delete <config_name>
muskie9

2
短縮形式はdrush cdel <config_name>
18年

注意して、あなたはどんなのconfigsを削除した場合、あなたも行う必要がありdrush cr、キャッシュされた設定の依存関係を削除した後にそうでなければ、このようなこと何かがルックスれることがありますError: Call to a member function getConfigDependencyKey() on null
ウィルコ

13

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

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

または

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


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

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


5
これは最近変更された可能性がありますが、現在は少し異なります。依存関係:強制:モジュール:-yourmodule
hw。

1
@hwあなたのコメントは非常に重要です。可能であれば、関連する変更レコードへのリンクを使用して、回答に追加することを検討してください。見つかりませんでした。
-rudolfbyker

ガァ!! これを行う方法があることは知っていましたが、「強制:」の部分を思い出すことができませんでした。これは、特にymlファイルで作成する場合に最も簡単でクリーンな方法です。
-UnsettlingTrend

このアプローチを使用してモジュールをインストールしようと、Drupalはエラーがスローされます:それは見つかりませんでした次のモジュールに依存しているため、モジュールcustom_moduleを有効にすることはできません:
ジョン・

こんにちは、ジョン。あなたがそれを理解しなかった場合、モジュールの依存関係を間違った場所に置いたように聞こえます。この回答で説明されている設定は、モジュールのconfig / installディレクトリにあるYMLファイルに移動することを目的としています。OPの場合、これは彼/彼女のconfig / install / field.storage.bloom_stem.bs_twitter_ac.ymlファイルにあります。代わりに、モジュールのmymodule.info.ymlファイルに依存関係を置いたように聞こえます(これにより、モジュールをインストールできなくなります)
Daniel Scott

9

drupalコンソールの使用:

$ drupal config:delete 'the_config_to_delete'

1
Docs at:hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…しかし、ワイルドカードを使用できますか?例えばdrupal config:delete 'migrate_plus.migration.*'
ニック

2
最新のdrupalコンソールでは、config:deleteは設定タイプを最初に指定することを期待しています。たとえばdrupal config:delete active 'name'、「drupal config:delete staging 'name'(パラメーターが1つだけ指定されている場合、タイプを指定したと仮定してプロンプトを表示します)構成名。)
ウィリアムタレル

6

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



2

Drupalコンソールを使用して、アクティブな構成を削除できますdrupal config:delete active config_to_delete


1

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


0

ここに、設定の残りを削除する小さな(まだ少し設計が行き届いた)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

1
PHP開発者にPythonスクリプトの使用を求めていますか?少しばかげているようです。
パトリック

0

Easy Installモジュールを使用して、この構成の問題を回避します。このモジュールは、モジュールのアンインストール中に構成を削除できます。モジュールの構成にymlの施行が含まていない場合、またはオプションフォルダーに構成が追加れていない場合でも動作します。

アンインストールイメージの構成


0

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

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

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

0

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

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

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

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


0

モジュールがアンインストールされたらhook_uninstallを使用して構成を削除します。

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

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.