forked from jasny/session-middleware
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSessionMiddleware.php
More file actions
82 lines (70 loc) · 2.29 KB
/
Copy pathSessionMiddleware.php
File metadata and controls
82 lines (70 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
declare(strict_types=1);
namespace Jasny\Session;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Psr\Http\Message\ServerRequestInterface as ServerRequest;
use Psr\Http\Message\ResponseInterface as Response;
/**
* Middleware to start a session.
* The session can be mocked by setting the 'session' attribute of the server request.
*/
class SessionMiddleware implements MiddlewareInterface
{
/** @var SessionInterface|null */
protected $defaultSession;
/**
* Class constructor.
*/
public function __construct(?SessionInterface $session = null)
{
$this->defaultSession = $session ?? new GlobalSession();
}
/**
* Process an incoming server request (PSR-15).
*
* @param ServerRequest $request
* @param RequestHandler $handler
* @return Response
*/
public function process(ServerRequest $request, RequestHandler $handler): Response
{
return $this->run($request, \Closure::fromCallable([$handler, 'handle']));
}
/**
* Get a callback that can be used as double pass middleware.
*
* @return callable(ServerRequest,Response,callable):Response
*/
public function asDoublePass(): callable
{
return function (ServerRequest $request, Response $response, callable $next): Response {
return $this->run($request, function ($request) use ($next, $response) {
return $next($request, $response);
});
};
}
/**
* @param ServerRequest $request
* @param callable $handle
* @return Response
*/
protected function run(ServerRequest $request, callable $handle): Response
{
$session = $request->getAttribute('session');
if ($session !== null && !$session instanceof SessionInterface) {
trigger_error("'session' attribute of server request isn't a session object", E_USER_WARNING);
return $handle($request);
}
if ($session === null) {
$session = $this->defaultSession;
$request = $request->withAttribute('session', $session);
}
$session->start();
try {
return $handle($request);
} finally {
$session->stop();
}
}
}