📜  防止 development.services.yml 覆盖 (1)

📅  最后修改于: 2023-12-03 14:58:38.514000             🧑  作者: Mango

防止 development.services.yml 覆盖

在Drupal 8中,development.services.yml文件通常用于在开发阶段中为模块注入服务、重写服务等,以便于调试和开发。

然而问题可能会在development.services.yml文件中存在于你在生产环境中更新或升级时可能覆盖其他模块的现有服务,这可能会导致服务冲突和应用程序故障。

为了避免development.services.yml文件覆盖其他模块的服务,我们建议使用以下方法:

  1. 将所有服务定义放在独立文件中(每个模块一个文件),然后在development.services.yml文件中引用它们。
# custom_module.services.yml
services:
  custom_module.example_service:
    class: Drupal\custom_module\ExampleService
    arguments: ['@entity.manager', '@logger']

然后在development.services.yml中引用它:

imports:
  - { resource: './custom_module.services.yml' }
  1. 在自定义模块中重写要更改的服务。

有时可能需要在development.services.yml文件中重写其他模块的服务,因为自定义模块需要提供自己的实现。在这种情况下,建议在自定义模块中创建单独的服务定义,而不是在development.services.yml文件中覆盖其他模块的服务,如下所示:

# custom_module.services.yml
services:
  custom_module.example_service:
    class: Drupal\custom_module\ExampleService
    arguments: ['@entity.manager', '@logger']

# custom_module.module
function custom_module_container_alter(&$container) {
  $definition = $container->getDefinition('other_module.example_service');
  $definition->setClass('Drupal\custom_module\ExampleService');
}

上面的代码将重写其他模块中的example_service服务,而不会影响其他服务。这可以确保在更新或升级时不会覆盖其他模块的服务。

通过上述方法,我们可以避免在development.services.yml文件中遇到的与其他模块的服务冲突问题。