Как изменить основные службы по умолчанию

8

Внедрение зависимостей добавлено в ядро, но нет документации, чтобы сказать, как разработчик может изменить службы по умолчанию. Например, я хотел бы изменить класс cache.bootstrap на APC Caching.

Энди Труонг
источник
1
Ох, но есть :)
Клайв
Ой, моя вина. Я прошу прощения.
Энди Чыонг
Не нужно извиняться, если вы не знаете, что это сделано с помощью пропусков компилятора, я думаю, что это будет довольно сложно найти. Если у вас есть шанс, пожалуйста, добавьте ответ с кодом, который вы в конечном итоге используете, я уверен, что он будет очень полезен для будущих посетителей. Если нет, я постараюсь не забыть вернуться и добавить что-то общее
Клайв
Это больше не делается с помощью проходов компилятора.
Ответ @chx идеален, но обратите внимание, что ваш пример - особый случай. Я предлагаю вам открыть отдельный вопрос о том, как предоставить другой бэкэнд кеша, и мы можем ответить на него подробно.
Бердир

Ответы:

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()- вы можете просто обновить определение.
Энди