Comment changer les services par défaut du noyau

8

L'injection de dépendance est ajoutée au noyau, mais il n'y a aucune documentation pour dire comment le développeur peut modifier les services par défaut. Par exemple, je voudrais changer la classe cache.bootstrap en APC Caching.

Andy Truong
la source
1
Oh mais il y a :)
Clive
Aw, ma faute. Je suis désolé.
Andy Truong
Pas besoin de vous excuser, sauf si vous savez que cela se fait en utilisant des passes de compilation, je pense que ce serait assez difficile à trouver. Si vous en avez l'occasion, veuillez ajouter une réponse avec le code que vous finissez par utiliser, je suis sûr qu'il sera très utile aux futurs visiteurs. Sinon, j'essaierai de me souvenir de revenir et d'ajouter quelque chose de générique dans
Clive
Cela ne se fait plus à l'aide des passes du compilateur.
La réponse de @chx est parfaite, mais notez que votre exemple est un cas particulier. Je vous suggère d'ouvrir une question distincte sur la façon de fournir un backend de cache différent et nous pouvons y répondre en détail.
Berdir

Réponses:

5

Vous pouvez consulter LanguageTestServiceProvider pour voir comment les modifications sont effectuées. Ou je peux offrir ma classe:

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

}

Fondamentalement, si altervous devez utiliser la getDefinitionméthode, faites quelque chose avec la définition , puis utilisez la setDefinitionméthode pour la remettre.

puis voici les parties pertinentes de mongodb.services.yml:

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

la source
Je voulais juste mentionner qu'il semble que vous n'ayez pas besoin d'utiliser setDefintion()si vous l'avez utilisé getDefinition()- vous pouvez simplement mettre à jour la définition.
Andy