web-dev-qa-db-ja.com

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

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

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

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

13
user34185

動的キャッシュは、優先度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 ..

13
4k4

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

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

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

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

願っています。

6
kororo