So ändern Sie die Standarddienste des Kerns

8

Die Abhängigkeitsinjektion wird dem Kern hinzugefügt, es gibt jedoch keine Dokumentation darüber, wie Entwickler die Standarddienste ändern können. Zum Beispiel möchte ich die Klasse cache.bootstrap in APC Caching ändern.

Andy Truong
quelle
1
Oh, aber es gibt :)
Clive
Oh, meine Schuld. Tut mir leid.
Andy Truong
Sie müssen sich nicht entschuldigen, es sei denn, Sie wissen, dass Compiler-Pässe verwendet werden. Ich denke, das wäre ziemlich schwer zu finden. Wenn Sie eine Chance bekommen, fügen Sie bitte eine Antwort mit dem Code hinzu, den Sie letztendlich verwenden. Ich bin sicher, dass dies für zukünftige Besucher sehr nützlich sein wird. Wenn nicht, werde ich versuchen, mich daran zu erinnern, zurück zu kommen und etwas Generisches hinzuzufügen
Clive
Compiler-Pässe werden nicht mehr verwendet.
Die Antwort von @chx ist perfekt, aber beachten Sie, dass Ihr Beispiel ein Sonderfall ist. Ich schlage vor, Sie öffnen eine separate Frage zur Bereitstellung eines anderen Cache-Backends, die wir im Detail beantworten können.
Berdir

Antworten:

5

Sie können sich LanguageTestServiceProvider ansehen, um zu sehen, wie Änderungen vorgenommen werden. Oder ich kann meine Klasse anbieten:

<?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));
    }
  }

}

Grundsätzlich müssen alterSie die getDefinitionMethode verwenden, etwas mit der Definition tun und sie dann mithilfe der setDefinitionMethode zurücksetzen.

und dann sind hier die relevanten Teile von mongodb.services.yml:

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

quelle
Ich wollte nur erwähnen, dass es so aussieht, als müssten Sie es nicht verwenden, setDefintion()wenn Sie es verwendet haben getDefinition()- Sie können einfach die Definition aktualisieren.
Andy