Completed
Branch 2.x (03096d)
by Julián
08:36
created

SessionHandling::__invoke()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 22
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 8.6737
c 0
b 0
f 0
cc 5
eloc 14
nc 4
nop 3
1
<?php
2
3
/*
4
 * sessionware (https://github.com/juliangut/sessionware).
5
 * PSR7 session management middleware.
6
 *
7
 * @license BSD-3-Clause
8
 * @link https://github.com/juliangut/sessionware
9
 * @author Julián Gutiérrez <[email protected]>
10
 */
11
12
declare(strict_types=1);
13
14
namespace Jgut\Sessionware\Middleware;
15
16
use Jgut\Sessionware\Session;
17
use Psr\Http\Message\ResponseInterface;
18
use Psr\Http\Message\ServerRequestInterface;
19
20
/**
21
 * Session handling middleware.
22
 */
23
class SessionHandling
24
{
25
    const SESSION_KEY = '__SESSIONWARE_SESSION__';
26
27
    /**
28
     * @var Session
29
     */
30
    protected $session;
31
32
    /**
33
     * Middleware constructor.
34
     *
35
     * @param Session $session
36
     */
37
    public function __construct(Session $session)
38
    {
39
        $this->session = $session;
40
    }
41
42
    /**
43
     * Get session from request.
44
     *
45
     * @param ServerRequestInterface $request
46
     *
47
     * @return Session
48
     */
49
    public static function getSession(ServerRequestInterface $request) : Session
50
    {
51
        return $request->getAttribute(static::SESSION_KEY);
52
    }
53
54
    /**
55
     * Execute middleware.
56
     *
57
     * @param ServerRequestInterface $request
58
     * @param ResponseInterface      $response
59
     * @param callable               $next
60
     *
61
     * @throws \RuntimeException
62
     *
63
     * @return ResponseInterface
64
     */
65
    public function __invoke(
66
        ServerRequestInterface $request,
67
        ResponseInterface $response,
68
        callable $next
69
    ) : ResponseInterface {
70
        $requestCookies = $request->getCookieParams();
71
        $sessionName = $this->session->getManager()->getConfiguration()->getName();
72
        if (array_key_exists($sessionName, $requestCookies) && !empty($requestCookies[$sessionName])) {
73
            $this->session->setId($requestCookies[$sessionName]);
74
        }
75
76
        /* @var ResponseInterface $response */
77
        $response = $next($request->withAttribute(static::SESSION_KEY, $this->session), $response);
78
79
        if (!empty($this->session->getId()) && !$this->session->isDestroyed()) {
80
            $response = $response->withAddedHeader('Set-Cookie', $this->session->getCookieString());
81
        }
82
83
        $this->session->close();
84
85
        return $response;
86
    }
87
}
88