<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class LoginSubscriber implements EventSubscriberInterface
{
protected $security;
protected $em;
protected $router;
public function __construct(Security $security, EntityManagerInterface $em, UrlGeneratorInterface $router)
{
$this->security = $security;
$this->em = $em;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [ KernelEvents::REQUEST => 'onRequest' ];
}
public function onRequest(RequestEvent $event): void {
$url = $this->router->generate('app_login');
// if(strstr($url, $event->getRequest()->getRequestUri())) {
// return;
// }
// if conditions met
// 301 redirect to some internal or external URL
// if(!$event->isMainRequest()) {
// return;
// }
// TODO: disable this for guest donation
// $user = $this->security->getUser();
// if(!$user) {
// if(str_starts_with($event->getRequest()->getRequestUri(), '/donation') || str_starts_with($event->getRequest()->getRequestUri(), '/support-our-work') || str_starts_with($event->getRequest()->getRequestUri(), '/project/follow') ) {
// $loginReturnUrl = $this->router->generate('app_login', ['returnUrl' => $event->getRequest()->getRequestUri()]);
// $event->setResponse(new RedirectResponse($loginReturnUrl));
// // } else {
// // $event->setResponse(new RedirectResponse($url));
// }
// }
$user = $this->security->getUser();
if(!$user) {
if( str_starts_with($event->getRequest()->getRequestUri(), '/support-our-work') ) {
$loginReturnUrl = $this->router->generate('app_login', ['returnUrl' => $event->getRequest()->getRequestUri()]);
if ( str_contains($event->getRequest()->getRequestUri(), 'is_recurring=1')) { // Check only recurring
$event->setResponse(new RedirectResponse($loginReturnUrl));
}
}
if( str_starts_with($event->getRequest()->getRequestUri(), '/project/follow') ) {
$loginReturnUrl = $this->router->generate('app_login', ['returnUrl' => $event->getRequest()->getRequestUri()]);
$event->setResponse(new RedirectResponse($loginReturnUrl));
}
}
return;
}
}