PSR-15 middleware that allows having session inside the request attributes.
Install using composer, by default it uses an implementation of Aura Session.
composer require antidot-fw/session
Using Antidot Framework Starter, it will work after adding the middleware to the pipeline. Also, you can use it in any PSR-15 compatible middleware pipeline using PSR-11 container.
<?php
$sessionFactory = new AuraSessionFactory();
$sessionMiddleware = new SessionMiddleware($sessionFactory($container));
Add it to your pipeline
<?php
use Antidot\Application\Http\Application;
use Antidot\Application\Http\Middleware\RouteDispatcherMiddleware;
use Antidot\Session\Application\Http\Middleware\SessionMiddleware;
...
return static function (Application $app) : void {
$app->pipe(...);
$app->pipe(SessionMiddleware::class); // added here
$app->pipe(RouteDispatcherMiddleware::class);
...
};
The session will be stored as request attribute, For example using a Request handler, and it will be available in middleware loaded after it too.
<?php
// src/Handler/SomeHandler.php
declare(strict_types=1);
namespace App\Handler;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Zend\Diactoros\Response\HtmlResponse;
class SomeHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request): ResponseInterface
{
/** @var \Antidot\Session\Application\Http\SessionSegment $session */
$session = $request->getAttribute('session');
$session->set('foo', 'bar');
$session->set('baz', 'dib');
$message = $session->get('foo'); // 'bar'
$message = $session->get('baz'); // 'dib'
$session->setFlash('message', 'Hello world!');
$message = $session->getFlash('message'); // 'Hello world!'
...
}
}
To create a wrapper for your own custom session, you need to implement both Antidot\Session\Application\Http\SessionSegment
and Antidot\Session\Application\Http\SessionSegmentFactory
clases, take a look to the
Antidot\Session\Infrastructure\AuraSessionSegment
and Antidot\Session\Infrastructure\AuraSessionSegmentFactory
.
<?php
declare(strict_types=1);
namespace Antidot\Session\Application\Http;
interface SessionSegment
{
public function get(string $identity);
public function getFlash(string $identity);
public function set(string $identity, $value): void;
public function setFlash(string $identity, $value): void;
}
<?php
declare(strict_types=1);
namespace Antidot\Session\Application\Http;
use Psr\Http\Message\ServerRequestInterface;
interface SessionSegmentFactory
{
public function __invoke(ServerRequestInterface $request): SessionSegment;
}