如何从活动配置中删除配置对象?


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

简易安装模块可以修复并完全避免此问题drupal.org/project/easy_install
Karthikeyan Manivasagam 18/12/13

Answers:


53

目前最简单的方法是使用drush php(或core-cli)打开一个交互式会话。

然后使用:

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

此功能也将添加到Drupal控制台中。


1
这完美地解决了问题。将“ system.menu.devel”更改为“ the_setting.you.want.to.delete”
Eric Steinborn

如何删除多个配置?例如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 '17

2
缩短格式为drush cdel <config_name>
Sharique

请注意,如果您删除任何配置,还应该执行drush cr之后操作以删除所有缓存的配置依赖项,否则可能会出现以下情况:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

您可以使用以下方法。在hook_uninstall中使用以下代码

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

要么

在yml文件中,您可以将依赖项放在


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

然后drupal将按照Berdir此处https://drupal.stackexchange.com/a/173879/10436的说明在卸载模块时自动删除此配置


5
最近可能有所变化,但现在略有不同。依赖项:强制执行:模块:-yourmodule
硬件。

1
@hw您的评论非常重要。考虑将其添加到答案中,并在可能的情况下提供指向相关变更记录的链接。我找不到
rudolfbyker

H!我知道有一种方法可以执行此操作,但是我不记得“ enforced:”部分。这是最简单,最干净的方法,尤其是在yml文件中创建它们时。
趋势趋势

使用这种方法并尝试安装模块时,Drupal会引发错误:无法启用模块custom_module,因为它依赖于以下找不到的模块:
John

约翰,您好,以防万一您最终没有弄清楚它,这听起来好像您将模块依赖项放在错误的位置。此答案中描述的配置旨在放入模块中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
文件位于:hechoendrupal.gitbooks.io/drupal-console/content/en/commands / ...但是它可以做通配符吗?例如drupal config:delete 'migrate_plus.migration.*'
Nic

2
在最新的drupal控制台中,config:delete希望您首先指定配置类型,例如,drupal config:delete active 'name'或`drupal config:delete登台'name'(仅提供一个参数,它将假定您已给它指定类型并提示您) (表示配置名称。)
William Turrell,2016年

6

Drupal :: configFactory()-> reset()不会删除配置对象。对于此运行Drupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()




1

使用drush config-list搜索列出的所有配置, 然后标识要删除的配置。使用以下命令删除配置 drush 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

从自定义模块卸载活动配置

我尝试从自定义模块中卸载配置文件时遇到了同样的问题。我有一个自定义模块,用于传递Webform的自定义配置文件。由于我并不完美,因此我希望能够卸载模块,编辑代码并重新安装。我发现是否在config / install yml文件的dependencies / enforced部分中引用了我的自定义模块(my_module),当我卸载模块时,配置文件也会被卸载。

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

0

所有这些答案都建议直接删除基础配置对象,但是正确的方法是通过实体存储系统删除实体。

例如,如果您具有ID为“ large”的图像样式,并且想要删除它,则应执行以下操作:

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

这样,Core将在删除配置之前调用“ predelete”,并在删除配置之后调用“ delete”钩子,其他模块可能依赖该钩子执行各种清理操作。


0

卸载模块后,使用hook_uninstall删除配置。

然后删除配置:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.