web-dev-qa-db-ja.com

イベントサブスクライバーをオーバーライド/置換できますか

イベントサブスクライバーを置き換えたいのですが。既存のイベントサブスクライバーの前後で実行される代わりに、別の既存のイベントサブスクライバーを置き換えるEventSubscriberInterfaceを実装するクラスを作成する方法はありますか?.

2
pv1

これを行うには、ServiceProviderクラスを作成します。

path_subscriberサービスをオーバーライドするサービスプロバイダークラスの例。

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

別の解決策は、次のようにMY_MODULE.services.ymlのサービスをオーバーライドすることです。

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