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()
でルーターを再構築しました。これは機能しますが、非常に重いもののようです。
キャッシュタグ無効化ツールを使用して、ルートのキャッシュタグを無効化する方法を見つけようとしましたが、どのキャッシュタグを渡すべきかわかりませんでした。
だから私の質問は:
全体を再構築するのではなく、ルーターを部分的に再構築する方法はありますか?または...
ルートのキャッシュを無効にする方法はありますか?
\Drupal::service('router.builder')->rebuild()
の代わりに、ルートの一致を無効にすることができます:
Cache::invalidateTags(['route_match']);
静的ルートは変更されないため、ルーターテーブルを再構築する必要はありません。クリアする必要があるのはルートの一致です。これは、処理されたパスで計算され、未処理のパスに格納されます。そして、これはあなたの場合に変化する関係です。
ルートを再構築した後、まだルート一致コレクションにあるルートがない可能性があるため、ルータービルダーはルート一致を無効にします。
より選択的にするために、RouteProviderRouteProvider::getRouteCollectionForRequest
のフロントページに2番目のキャッシュタグを追加して、このタグのみを無効にすることができます。
もちろん、ページキャッシュに保存されているフロントページのエントリを無効にする必要もありますが、おそらくフロントページには、ターゲットにできる特定のキャッシュタグがすでにあります。