KernelEvents :: REQUESTがキャッシュされたページで起動されない


12

KernelEvents :: REQUESTイベントサブスクライバーを実装して、ページの読み込み時に何らかのアクションを実行しようとしています。

リクエストされたページがDrupalキャッシュに存在するかどうかに関係なく、このイベントを起動する必要があります。Drupalがキャッシュから何かを提供するときにKernelEvents :: REQUESTが起動しないようです。

これを達成するために使用できるイベントはありますか、または何らかの形のミドルウェアとして要件を実装する必要がありますか?


1
REQUESTイベントはトリガーされる必要があり、そうでなければ応答がありません。私見あなたのESが悪い重量があるので、あなたのESがトリガ得ることはありません、さらに、イベントのhttp_middleware.page_cache(または動的なページキャッシュ)サービスが停止して伝播を。

ESの重み/優先度は20に設定されています

4k4が書いたように、匿名ユーザーのpage_cacheはミドルウェアであり、REQUESTイベントのかなり前に発生します。先に来る独自のミドルウェアを作成することもできますが、自分のアプローチを再検討する必要があるかもしれません。何がそんなに早く起こる必要があるのでしょうか?匿名のページキャッシュは、ワニスの他の外部ソフトウェアやブラウザ自体でも発生する可能性があることに注意してください。コア統計モジュールがページ訪問を追跡する方法を見てください。ユーザーが実行するとサーバーにpingを実行するJavaScriptを使用します。
Berdir 2016年

@Berdirこれは、シールドモジュールと同様に、サイトにhttp認証を提供するためのものです。したがって、これは、リクエストで可能な限り早期に処理する必要がある何かの有効な例を表していると思います。(私はミドルウェアとして実装されたD8シールドモジュールパッチがあることを認識しています-この制限のために私は想定しています)。

回答:


12

動的キャッシュは、優先度27のイベントをサブスクライブします。その前にコードを実行する場合は、優先度> 27を使用する必要があります。

  public static function getSubscribedEvents() {
    $events = [];

    // Run after AuthenticationSubscriber (necessary for the 'user' cache
    // context; priority 300) and MaintenanceModeSubscriber (Dynamic Page Cache
    // should not be polluted by maintenance mode-specific behavior; priority
    // 30), but before ContentControllerSubscriber (updates _controller, but
    // that is a no-op when Dynamic Page Cache runs; priority 25).
    $events[KernelEvents::REQUEST][] = ['onRequest', 27];

これはDynamicPageCacheSubscriber :: onRequestを実行します。


優先度は20に設定されています

あなたが持っている問題は動的キャッシュからのイベントにあると思います、私は私の答えを編集しました。
2016年

@ 4k4に感謝しますが、優先度を30に設定しても同じように動作します(変更を加えた後、モジュールを再インストールしてすべてのキャッシュをクリアしました)。他のアイデアは?

2つのキャッシュがあります。動的キャッシュよりも優先されるようになったので、ページキャッシュが残っています。ページキャッシュはメインカーネルの前に実行されます。このモジュールをアンインストールして、それがなくてもパフォーマンスに問題がないかどうかをテストできます。
2016年

これでうまくいったことを確認できます。ページがキャッシュされる前に、一度だけリダイレクトが発生しました。優先度を追加する['checkForRediret', 30];と、期待どおりに機能しました。
Cyclonecode 2017

5

Drupal 8には、ページキャッシュと動的ページキャッシュの2つのレベルのキャッシュがあります。

はい、@ 4k4が述べたように動的ページキャッシュをインターセプトできます。発生している問題は、ページキャッシュを妨害する可能性が高くなります。キーはここにあります

これにはいくつかの解決策があります:

  1. 「HttpKernelInterface」を実装する新しいクラスを追加し、「http_middleware」を200より高い優先度で登録します(280で対応)。参照については、「PageCache」クラスと実装を参照してください。

  2. 「ServiceProviderBase」から拡張して、既存の「PageCache」を変更する新しいクラスを作成します。こちらで参考にしてください。次に、「PageCache」を拡張する新しいクラスを作成します。

ここにコード参照があります:

これはStaticCacheServiceProvider.phpです。

/**
 * Modifies the language manager service.
 */
class StaticCacheServiceProvider extends ServiceProviderBase
{
  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container)
  {
    // Overrides language_manager class to test domain language negotiation.
    $definition = $container->getDefinition('http_middleware.page_cache');
    $definition->setClass('Drupal\your_module\StackMiddleware\StaticCache');
  }
}

これはStaticCache.phpです。

/**
 * Executes the page caching before the main kernel takes over the request.
 */
class StaticCache extends PageCache
{
  /**
   * {@inheritdoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
  {
    // do special logic here.

    $response = parent::handle($request, $type, $catch);

    return $response;
  }
}

願っています。


これは私が解決策1を実装することで問題を解決し、非常に有用ありがとうでした
レムコHoeneveld
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.