Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CoreBundle\Helper; | |
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
use Symfony\Component\HttpFoundation\Cookie; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Symfony\Component\HttpKernel\Event\ResponseEvent; | |
use Symfony\Component\HttpKernel\KernelEvents; | |
class CookieHelper implements EventSubscriberInterface | |
{ | |
private ?Request $request = null; | |
/** | |
* @var array<string, Cookie> | |
*/ | |
private array $cookies = []; | |
public function __construct( | |
private ?string $path, | |
private ?string $domain, | |
private bool $secure, | |
private bool $httponly, | |
private RequestStack $requestStack | |
) { | |
} | |
/** | |
* @param mixed $default | |
* | |
* @return mixed | |
*/ | |
public function getCookie(string $key, $default = null) | |
{ | |
if (null === $this->getRequest()) { | |
return $default; | |
} | |
return $this->getRequest()->cookies->get($key, $default); | |
} | |
/** | |
* @param int|string|float|bool|object|null $value | |
*/ | |
public function setCookie(string $name, $value, ?int $expire = 1800, ?string $path = null, ?string $domain = null, ?bool $secure = null, ?bool $httponly = null, ?string $sameSite = Cookie::SAMESITE_LAX): void | |
{ | |
if (null !== $value) { | |
$value = (string) $value; | |
} | |
$cookie = Cookie::create( | |
$name, | |
$value, | |
null !== $expire ? time() + $expire : 0, | |
$path ?? $this->path, | |
$domain ?? $this->domain, | |
$secure ?? $this->secure, | |
$httponly ?? $this->httponly, | |
false, | |
$sameSite | |
); | |
$this->cookies[$name] = $cookie; | |
} | |
/** | |
* Deletes a cookie by expiring it. | |
*/ | |
public function deleteCookie(string $name, ?string $path = null, ?string $domain = null, ?bool $secure = null, ?bool $httponly = null, ?string $sameSite = Cookie::SAMESITE_LAX): void | |
{ | |
$this->setCookie($name, '', -86400, $path, $domain, $secure, $httponly, $sameSite); | |
} | |
public function onResponse(ResponseEvent $event): void | |
{ | |
foreach ($this->cookies as $cookie) { | |
$event->getResponse()->headers->setCookie($cookie); | |
} | |
} | |
public static function getSubscribedEvents(): array | |
{ | |
return [ | |
KernelEvents::RESPONSE => 'onResponse', | |
]; | |
} | |
private function getRequest(): ?Request | |
{ | |
if (null !== $this->request) { | |
return $this->request; | |
} | |
return $this->request = $this->requestStack->getMainRequest(); | |
} | |
} | |