web-dev-qa-db-ja.com

EventSubscriberサービスの登録時のsetContainerエラー

基本的なイベントサブスクライバーを作成しようとしていますが、services.ymlファイルを追加し、_drush cr_を使用してキャッシュを再構築しようとすると、このエラーが発生します。

Drupal.phpの130行目:

_\Drupal::$container_はまだ初期化されていません。 \Drupal::setContainer()は、実際のコンテナで呼び出す必要があります。

Drupalからキャッシュをクリアすると正常に動作しますが、Drushは常にエラーになります。 servicesファイルを削除すると、Drushは再び正常に動作します。

誰かこれを見たことがある?これを解決せずに前進したくない。このプロジェクトでは、以前に問題なくサービスとイベントサブスクライバーを追加しました。スペーシング構造などを再確認しました。

module/gary_custom.services.yml

_services:
  gary_custom.custom_event_subscriber:
    class: Drupal\gary_custom\EventSubscriber\CustomEventSubscriber
    tags:
      - { name: event_subscriber }
_

module/src/EventSubscriber/CustomEventSubscriber.php

_namespace Drupal\gary_custom\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class CustomEventSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  static function getSubscribedEvents() {
    \Drupal::logger('debug')->debug('get sub events');

    $events[KernelEvents::REQUEST][] = array('checkForRedirection');
    return $events;
  }

  /**
   * This method is called whenever the KernelEvents::REQUEST event is
   * dispatched.
   *
   * @param GetResponseEvent $event
   */
  public function checkForRedirection(GetResponseEvent $event) {
    \Drupal::logger('debug')->debug('hitting');
  }
}
_

Drush 9.4.0を使用しています。

1
Matt Campbell

問題はgetSubscribedEventsのログ行です:

\Drupal::logger('debug')->debug('get sub events');

Drupal::loggerはコンテナーにサービスを照会しますが、コンテナーは、イベントサブスクライバーのディスカバリーが発生した時点では設定されていません。

イベントハンドラーが呼び出されるときまでに、コンテナーは初期化されているので、checkForRedirectionへのログインは正常に機能するはずです。

1
Clive