safedelete-1.0.0/modules/safedelete_menu_report/src/EventSubscriber/ReportMessageSubscriber.php
modules/safedelete_menu_report/src/EventSubscriber/ReportMessageSubscriber.php
<?php
namespace Drupal\safedelete_menu_report\EventSubscriber;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\Core\Render\Markup;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class ReportMessageSubscriber implements EventSubscriberInterface {
protected MessengerInterface $messenger;
protected FileSystemInterface $fs;
protected CurrentRouteMatch $routeMatch;
protected LanguageManagerInterface $languageManager;
protected AccountProxyInterface $currentUser;
public function __construct(MessengerInterface $messenger, FileSystemInterface $fs, CurrentRouteMatch $routeMatch, LanguageManagerInterface $languageManager = NULL, AccountProxyInterface $currentUser) {
$this->messenger = $messenger;
$this->fs = $fs;
$this->routeMatch = $routeMatch;
$this->languageManager = $languageManager ?: \Drupal::languageManager();
$this->currentUser = $currentUser;
}
public static function getSubscribedEvents(): array {
return [
KernelEvents::REQUEST => ['onRequest', -100],
];
}
public function onRequest(RequestEvent $event): void {
$request = $event->getRequest();
if ($request->isXmlHttpRequest()) {
return;
}
$route = $this->routeMatch->getRouteName();
if (!in_array($route, ['system.status', 'system.admin_content', 'content_moderation.admin_moderated_content'], TRUE)) {
return;
}
// Only proceed if the user has permission to view the safedelete report.
// (Prevents unnecessary I/O and avoids exposing hints to unauthorized users.)
if (!$this->currentUser->hasPermission('safedelete-report')) {
return;
}
$real = $this->fs->realpath('public://safedelete_menu_report.txt');
if (!$real || !is_file($real)) {
return;
}
$txt = @file_get_contents($real) ?: '';
$txt = trim($txt);
if ($txt === '') {
return;
}
$lang = $this->languageManager->getCurrentLanguage();
$url = Url::fromRoute('safedelete_menu_report.report', [], ['language' => $lang]);
$link = Link::fromTextAndUrl(t('Click here to see the full report'), $url)->toString();
$message = 'Safedelete menu report has identified children needing a new parent. ' . $link . ' (Last updated: ' . htmlspecialchars($txt, ENT_QUOTES, 'UTF-8') . ')';
$this->messenger->addWarning(Markup::create($message));
}
}
