Cómo cambiar los servicios predeterminados de core

8

La inyección de dependencia se agrega al núcleo, pero no hay documentación que indique cómo el desarrollador puede alterar los servicios predeterminados. Por ejemplo, me gustaría cambiar la clase cache.bootstrap a APC Caching.

Andy Truong
fuente
1
Ah, pero hay :)
Clive
Aw, mi culpa. Lo siento.
Andy Truong
No es necesario que te disculpes, a menos que sepas que se hace usando los pases del compilador, creo que sería bastante difícil de encontrar. Si tiene la oportunidad, agregue una respuesta con el código que termina usando, estoy seguro de que será muy útil para los futuros visitantes. Si no, trataré de recordar volver y agregar algo genérico en
Clive
Ya no se hace con pases de compilación.
La respuesta de @chx es perfecta, pero tenga en cuenta que su ejemplo es un caso especial. Le sugiero que abra una pregunta por separado sobre cómo proporcionar un backend de caché diferente y podemos responder eso en detalle.
Berdir

Respuestas:

5

Puede consultar LanguageTestServiceProvider para ver cómo se realizan las modificaciones. O puedo ofrecer mi clase:

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

}

Básicamente, altersi necesita usar el getDefinitionmétodo, haga algo con la definición y luego use el setDefinitionmétodo para volver a colocarlo.

y aquí están las partes relevantes de mongodb.services.yml:

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

fuente
Solo quería mencionar que parece que no necesita usarlo setDefintion()si lo ha usado getDefinition(), solo puede actualizar la definición.
Andy