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
83
84
85
<?php
/**
* @see https://github.com/laminas/laminas-session for the canonical source repository
* @copyright https://github.com/laminas/laminas-session/blob/master/COPYRIGHT.md
* @license https://github.com/laminas/laminas-session/blob/master/LICENSE.md New BSD License
*/
namespace Laminas\Session;
use Laminas\EventManager\EventManager;
use Laminas\Session\Storage\StorageInterface;
use Laminas\Session\Validator\ValidatorInterface;
class ValidatorChain extends EventManager
{
/** @var StorageInterface */
protected $storage;
public function __construct(StorageInterface $storage)
{
parent::__construct();
$this->storage = $storage;
$validators = $storage->getMetadata('_VALID');
if ($validators) {
foreach ($validators as $validator => $data) {
$this->attachValidator('session.validate', [new $validator($data), 'isValid'], 1);
}
}
}
/**
* Attach a listener to the session validator chain.
*
* @param string $eventName
* @param callable $callback
* @param int $priority
* @return callable
*/
public function attach($eventName, callable $callback, $priority = 1)
{
return $this->attachValidator($eventName, $callback, $priority);
}
/**
* Retrieve session storage object
*
* @return StorageInterface
*/
public function getStorage()
{
return $this->storage;
}
/**
* Internal implementation for attaching a listener to the
* session validator chain.
*
* @param string $event
* @param callable $callback
* @param int $priority
* @return callable
*/
private function attachValidator($event, $callback, $priority)
{
$context = null;
if ($callback instanceof ValidatorInterface) {
$context = $callback;
} elseif (is_array($callback)) {
$test = array_shift($callback);
if ($test instanceof ValidatorInterface) {
$context = $test;
}
array_unshift($callback, $test);
}
if ($context instanceof ValidatorInterface) {
$data = $context->getData();
$name = $context->getName();
$this->getStorage()->setMetadata('_VALID', [$name => $data]);
}
return parent::attach($event, $callback, $priority);
}
}