web-dev-qa-db-ja.com

ルーターを部分的に再構築したり、ルートキャッシュを無効にする方法はありますか?

Groupsモジュール( http://dgo.to/group )を使用して、SaaS作業中のプロジェクトにグループを設定しています。私はグループにドメインフィールドを設定して、グループがバニティドメインを持つことができるようにします。そのため、グループには、サイトルートに表示されるカスタムフロントページを含めることができます。フロントページは、グループエンティティのフィールドとして設定されます。たとえば、グループ1はフロントページパスを_/page/1_として設定でき、グループ2はそれを_/page/2_として設定できます。

このフロントページを表示するために、インバウンドURL処理を使用して、さまざまなドメインのさまざまなパスを示しています。異なるパスを個別にキャッシュするために、Drupal\Core\Routing\RouteProviderRouteProvider::getRouteCollectionCacheId()をオーバーライドしました:

_  /**
   * {@inheritdoc}
   */
  protected function getRouteCollectionCacheId(Request $request) {
    $cache_id = parent::getRouteCollectionCacheId($request);

    // Get the current domain.
    $domain = $this->currentPath->getRequestStack()->getCurrentRequest()->getHost();

    $cache_id .= ':' . $domain;

    return $cache_id;
  }
_

これですべてうまくいきましたが、グループのフロントページへのパスが更新されると、ルーターが再構築されるまでページコンテンツが更新されないという問題に遭遇しました。

私は解決策を見つけました。hook_entity_update()を使用して\Drupal::service('router.builder')->rebuild()でルーターを再構築しました。これは機能しますが、非常に重いもののようです。

キャッシュタグ無効化ツールを使用して、ルートのキャッシュタグを無効化する方法を見つけようとしましたが、どのキャッシュタグを渡すべきかわかりませんでした。

だから私の質問は:

  1. 全体を再構築するのではなく、ルーターを部分的に再構築する方法はありますか?または...

  2. ルートのキャッシュを無効にする方法はありますか?

5
Jaypan

\Drupal::service('router.builder')->rebuild()の代わりに、ルートの一致を無効にすることができます:

Cache::invalidateTags(['route_match']);

静的ルートは変更されないため、ルーターテーブルを再構築する必要はありません。クリアする必要があるのはルートの一致です。これは、処理されたパスで計算され、未処理のパスに格納されます。そして、これはあなたの場合に変化する関係です。

ルートを再構築した後、まだルート一致コレクションにあるルートがない可能性があるため、ルータービルダーはルート一致を無効にします。

より選択的にするために、RouteProviderRouteProvider::getRouteCollectionForRequestのフロントページに2番目のキャッシュタグを追加して、このタグのみを無効にすることができます。

もちろん、ページキャッシュに保存されているフロントページのエントリを無効にする必要もありますが、おそらくフロントページには、ターゲットにできる特定のキャッシュタグがすでにあります。

5
4k4