web-dev-qa-db-ja.com

ページを読み込むたびにイベントがトリガーされない

Drupal 8 Webサイトでユーザーを自動ログインするためにカスタムモジュールでイベントディスパッチャーを使用しています。onRequest機能でKernelEvents :: REQUESTを使用しています。テスト用にエコーを配置しています関数が呼び出されたこと:

  • ユーザーがすでにログインしている場合、イベントは機能し、私のリクエストはすべてのリクエストで呼び出されました
  • ユーザーIS NOTがログインすると(匿名)、関数はページの最初のリクエストでのみ呼び出されました。ページをリロードした場合は、二度と呼び出しません。私のエコーを再び取得する唯一の方法は、drupalキャッシュを空にすることです(私はdrush crを作成します))。

Drupalキャッシュの動作が正確にわからない...匿名かどうかにかかわらず、すべてのリクエストでイベントをトリガーする方法はありますか?または、自動ログインを実行する別のより良い方法?ありがとうございます。

私のモジュール構造:

/mymodule
|-- /src
|---- /Controller
|------ MyModuleController.php
|---- /EventSubscriber
|------ MyModuleEventSubscriber.php
mymodule.info.yml
mymodule.routing.yml
mymodule.services.yml

MyModuleEventSubscriber.php

<?php

namespace Drupal\mymodule\EventSubscriber;

use Drupal\Core\Routing\ResettableStackedRouteMatchInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\externalauth\ExternalAuthInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;

class MyModuleEventSubscriber implements EventSubscriberInterface {

  protected $currentRouteMatch;
  protected $externalauth;
  protected $currentUser;

  /**
   * Constructs a MyModuleEventSubscriber object.
   */
  public function __construct(ResettableStackedRouteMatchInterface $currentRouteMatch, ExternalAuthInterface $externalauth, AccountProxyInterface $currentUser) {
    $this->currentRouteMatch = $currentRouteMatch;
    $this->externalauth = $externalauth;
    $this->currentUser = $currentUser;
  }

  /**
   * Implements EventSubscriberInterface::getSubscribedEvents().
   *
   * @return array
   *   An array of event listener definitions.
   */
  static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('onRequest');
    return $events;
  }

  public function onRequest(GetResponseEvent $event) {
      // echo 'test' => do my echo here
      if ($this->currentUser->id() == '0') {       
         auto_login(); // I simplified the code here, but you get the idea
      }      
  }
}

mymodule.services.yml

services:
  mymodule.event_subscriber:
    class: Drupal\mymodule\EventSubscriber\MyModuleEventSubscriber
    arguments: ['@current_route_match', '@externalauth.externalauth', '@current_user']
    tags:
      - { name: event_subscriber }
1
Snabow

これは、匿名ユーザーのページをキャッシュするモジュール「内部ページキャッシュ」のように見えます。このキャッシュは、イベントの前にミドルウェアとして実行されます。

あなたの場合、このモジュールは必要なく、アンインストールすることができます。

干渉する他のコードがある場合は、イベントサブスクライバーに設定した優先度でこれを制御できるはずです。

3
4k4