我正在尝试构建一个事件订阅者,该事件订阅者将在“刷新所有缓存”操作(通过管理菜单)完成后触发。我要在此处完成的工作是在缓存刷新完成后循环浏览主菜单,并使用\Drupal::httpClient()
请求触发每个页面的页面加载,以重建页面缓存。我正在听RoutingEvents::FINISHED
,但是我并不能一直确定这是最好的聆听事件。它似乎仅在清除缓存后才会触发,但是我不确定100%知道幕后发生了什么。有可能有更好的事件可以倾听,或者有更好的方法来完成我想做的事情?
EventSubscriber供参考:
public function onRouterFinishedScrape() {
\Drupal::logger('cache_scraper')->notice("Caches Cleared");
$menu_tree = \Drupal::menuTree();
$menu_name = 'main';
$parameters = $menu_tree->getCurrentRouteMenuTreeParameters($menu_name);
$base = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https://' : 'http://';
$base.= $_SERVER['SERVER_NAME'];
$tree = $menu_tree->load($menu_name, $parameters);
$client = \Drupal::httpClient();
foreach ($tree as $item) {
$url = $item->link->getUrlObject()->toString();
try {
$request = $client->get($base.$url);
$request->getBody();
\Drupal::logger('cache_scraper')->notice("Indexed: ".$base.$url);
}catch (RequestException $exception) {
\Drupal::logger('cache_scraper')->notice("Indexing failed on: ".$base.$url);
}
}
}
public static function getSubscribedEvents() {
$events = [];
// Act only when the router rebuild is finished.
$events[RoutingEvents::FINISHED][] = [
'onRouterFinishedScrape',
210,
];
return $events;
}