Como alterar os serviços padrão do núcleo

8

A Injeção de Dependência é adicionada ao núcleo, mas não há documentação para dizer como o desenvolvedor pode alterar os serviços padrão. Por exemplo, eu gostaria de mudar a classe cache.bootstrap para APC Caching.

Andy Truong
fonte
11
Ah, mas tem :)
Clive
Ah, minha culpa. Sinto muito.
Andy Truong
Não há necessidade de pedir desculpas, a menos que você saiba que é feito usando passes de compilador, acho que seria muito difícil de encontrar. Se você tiver uma chance, adicione uma resposta com o código que acaba usando, tenho certeza de que será muito útil para futuros visitantes. Caso contrário, tentarei lembrar de voltar e adicionar algo genérico em
Clive
Não é mais feito usando passes do compilador.
A resposta de @chx é perfeita, mas observe que seu exemplo é um caso especial. Sugiro que você abra uma pergunta separada sobre como fornecer um back-end de cache diferente e podemos responder isso em detalhes.
precisa saber é o seguinte

Respostas:

5

Você pode consultar o LanguageTestServiceProvider para ver como as alterações são feitas. Ou posso oferecer minha aula:

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

}

Basicamente, altervocê precisa usar o getDefinitionmétodo, fazer algo com a definição e, em seguida, usar o setDefinitionmétodo para colocá-lo de volta.

e aqui estão as partes relevantes do mongodb.services.yml:

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

fonte
Só queria mencionar que parece que você não precisa usar setDefintion()se já usou getDefinition()- basta atualizar a definição.
Andy