如何更改核心的默认服务


8

依赖注入已添加到核心,但是没有文档说明开发人员如何更改默认服务。例如,我想将cache.bootstrap类更改为APC Caching。


1
哦,但是有一个 :)
Clive

噢,我的错。对不起。
Andy Truong 2013年

无需道歉,除非您知道它是使用编译器传递完成的,我认为这很难找到。如果有机会,请在最终使用的代码中添加答案,我相信它将对将来的访问者非常有用。如果不是,我会尽量记得回来并添加一些通用的内容
Clive

不再使用编译器传递来完成。

@chx的答案是完美的,但请注意,您的示例是一个特例。我建议您就如何提供不同的缓存后端提出一个单独的问题,我们可以详细回答。
Berdir 2013年

Answers:


5

您可以查看LanguageTestServiceProvider来了解如何进行更改。或者我可以提供我的课程:

<?php
namespace Drupal\mongodb;

use Drupal\Core\DependencyInjection\ServiceModifierInterface;
use Drupal\Core\DependencyInjection\ServiceProviderInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;

/**
 * MongoDB service provider. Registers Mongo-related services.
 */
class MongodbServiceProvider implements ServiceProviderInterface, ServiceModifierInterface {

  /**
   * {@inheritdoc}
   */
  public function register(ContainerBuilder $container) {
  }

  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container) {
    foreach ($container->findTaggedServiceIds('mongodb.override') as $id => $attribute) {
      $container->setDefinition(substr($id, 8), $container->getDefinition($id));
    }
  }

}

基本上,alter您需要使用该getDefinition方法,对定义进行一些操作,然后使用该setDefinition方法将其放回去。

然后是mongodb.services.yml的相关部分:

services:
  mongodb.flood:
    class: Drupal\mongodb\Flood\MongoDBBackend
    arguments: ['@mongo', '@request']
    tags:
      - { name: mongodb.override }

只是想提一下,看起来好像不需要setDefintion()使用getDefinition()-您只需更新定义即可。
安迪
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.