add FallbackSession for stateless requests in Laravel

This commit is contained in:
Younes ENNAJI
2026-02-25 11:15:34 +00:00
parent e35339dca9
commit f9807e91e2
5 changed files with 330 additions and 11 deletions
+26
View File
@@ -0,0 +1,26 @@
<?php
declare(strict_types=1);
namespace Flasher\Laravel\Storage;
final class FallbackSession implements FallbackSessionInterface
{
/** @var array<string, mixed> */
private static array $storage = [];
public function get(string $name, mixed $default = null): mixed
{
return \array_key_exists($name, self::$storage) ? self::$storage[$name] : $default;
}
public function set(string $name, mixed $value): void
{
self::$storage[$name] = $value;
}
public static function reset(): void
{
self::$storage = [];
}
}
@@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace Flasher\Laravel\Storage;
interface FallbackSessionInterface
{
public function get(string $name, mixed $default = null): mixed;
public function set(string $name, mixed $value): void;
}
+22 -3
View File
@@ -6,26 +6,45 @@ namespace Flasher\Laravel\Storage;
use Flasher\Prime\Notification\Envelope;
use Flasher\Prime\Storage\Bag\BagInterface;
use Illuminate\Contracts\Session\Session;
use Illuminate\Session\SessionManager;
final readonly class SessionBag implements BagInterface
{
public const ENVELOPES_NAMESPACE = 'flasher::envelopes';
public function __construct(private SessionManager $session)
private FallbackSessionInterface $fallbackSession;
public function __construct(private SessionManager $sessionManager, ?FallbackSessionInterface $fallbackSession = null)
{
$this->fallbackSession = $fallbackSession ?? new FallbackSession();
}
public function get(): array
{
$session = $this->getSession();
/** @var Envelope[] $envelopes */
$envelopes = $this->session->get(self::ENVELOPES_NAMESPACE, []);
$envelopes = $session->get(self::ENVELOPES_NAMESPACE, []);
return $envelopes;
}
public function set(array $envelopes): void
{
$this->session->put(self::ENVELOPES_NAMESPACE, $envelopes);
$session = $this->getSession();
$session->set(self::ENVELOPES_NAMESPACE, $envelopes);
}
private function getSession(): Session|FallbackSessionInterface
{
$session = $this->sessionManager->driver();
if ($session->isStarted()) {
return $session;
}
return $this->fallbackSession;
}
}