Come modificare i servizi predefiniti del core


8

L'iniezione delle dipendenze viene aggiunta al core, ma non c'è documentazione che indichi come gli sviluppatori possano modificare i servizi predefiniti. Ad esempio, vorrei cambiare la classe cache.bootstrap in cache APC.


1
Oh, ma c'è :)
Clive

Aw, colpa mia. Mi dispiace.
Andy Truong,

Non c'è bisogno di scusarsi, a meno che tu non sappia che è stato fatto usando i passaggi del compilatore penso che sarebbe piuttosto difficile da trovare. Se ne hai la possibilità, aggiungi una risposta con il codice che finisci per usare, sono sicuro che sarà molto utile per i futuri visitatori. Altrimenti proverò a ricordare di tornare e aggiungere qualcosa di generico in
Clive

Non è più fatto usando i passaggi del compilatore.

La risposta di @chx è perfetta, ma nota che il tuo esempio è un caso speciale. Ti suggerisco di aprire una domanda separata su come fornire un backend di cache diverso e possiamo rispondere in dettaglio.
Berdir,

Risposte:


5

Puoi guardare LanguageTestServiceProvider per vedere come vengono apportate le modifiche. Oppure posso offrire la mia 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));
    }
  }

}

Fondamentalmente, alterè necessario utilizzare il getDefinitionmetodo, fare qualcosa con la definizione e quindi utilizzare il setDefinitionmetodo per rimetterlo.

e quindi ecco le parti rilevanti di mongodb.services.yml:

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

Volevo solo dire che sembra che non sia necessario utilizzarlo setDefintion()se lo hai utilizzato getDefinition(): puoi semplicemente aggiornare la definizione.
Andy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.