drupalorg-1.0.x-dev/src/EventSubscriber/LeadFormGatedPages.php
src/EventSubscriber/LeadFormGatedPages.php
<?php
namespace Drupal\drupalorg\EventSubscriber;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Path\CurrentPathStack;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Site\Settings;
use Drupal\Core\Url;
use Drupal\user\UserDataInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Event handler that gates some pages on filling out a lead form.
*/
class LeadFormGatedPages implements EventSubscriberInterface {
/**
* AllowedEntities constructor.
*
* @param \Drupal\Core\Session\AccountInterface $currentUser
* The current user.
* @param \Drupal\user\UserDataInterface $userData
* The user data.
* @param \Drupal\Core\Path\CurrentPathStack $currentPath
* The current route.
* @param \Drupal\Core\Messenger\MessengerInterface $messenger
* The messenger.
*/
public function __construct(
private AccountInterface $currentUser,
private UserDataInterface $userData,
private CurrentPathStack $currentPath,
private MessengerInterface $messenger,
) {
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array {
return [
KernelEvents::REQUEST => [['checkLeadForm']],
];
}
/**
* Checks if the page requires a lead form first.
*
* @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
* The Event to process.
*/
public function checkLeadForm(RequestEvent $event) {
$pages_required = Settings::get('drupalorg_pages_lead_form_required');
$current_path = $this->currentPath->getPath();
if (isset($pages_required[$current_path])) {
// Check the session.
$session = $event->getRequest()->getSession();
$data = $session->get('drupalorg_lead_forms', []);
if (!empty($data[$pages_required[$current_path]['form']])) {
// No redirect needed.
return;
}
// Check the user data.
if ($this->currentUser->isAuthenticated()) {
/** @var \Drupal\user\UserDataInterface $user_data */
$data = $this->userData->get('drupalorg', $this->currentUser->id(), 'lead_forms');
if (!empty($data[$pages_required[$current_path]['form']])) {
// No redirect needed.
return;
}
}
// Check for override.
if ($event->getRequest()->query->get('override') === $pages_required[$current_path]['override']) {
return;
}
// They have not filled out the lead form, redirect. Setting the message
// ensures we start a session and the response is not cached.
$this->messenger->addStatus(t('Please fill out the form on this page to proceed.'), FALSE);
$event->setResponse(new TrustedRedirectResponse(URL::fromUserInput($pages_required[$current_path]['redirect'])->toString()));
}
}
}
