web-dev-qa-db-fra.com

Est-il possible de remplacer / remplacer un abonné à un événement

Je souhaite remplacer un abonné à l'événement. Existe-t-il un moyen d'écrire ma classe implémentant EventSubscriberInterface qui remplacerait un autre abonné d'événement existant au lieu d'être exécuté plus tôt ou plus tard que celui existant.

2
pv1

Vous pouvez le faire en créant une classe ServiceProvider.

Exemple de classe de fournisseur de services pour remplacer le path_subscriber un service.

namespace Drupal\MY_MODULE;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\DependencyInjection\ServiceProviderBase;

// @note: You only need Reference, if you want to change service arguments.
use Symfony\Component\DependencyInjection\Reference;

/**
 * Modifies the path_subscriber service.
 */
class MyModuleServiceProvider extends ServiceProviderBase {

  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container) {
    // Overrides language_manager class to test domain language negotiation.
    // Adds entity_type.manager service as an additional argument.
    $definition = $container->getDefinition('path_subscriber');
    $definition->setClass('Drupal\MY_MODULE\MyCustomPathSubscriber')
      // Custom arguments.
      ->addArgument(new Reference('some_argument'));
  }
}

Une autre solution consiste à remplacer le service dans MY_MODULE.services.yml, comme ça:

path_subscriber:
  class: Drupal\MY_MODULE\MyCustomPathSubscriber
  arguments: [# The arguments]
2
user72672