Issues (40)

php-src/Http/Input.php (1 issue)

1
<?php
2
3
namespace kalanis\Restful\Http;
4
5
6
use ArrayIterator;
7
use Exception;
8
use IteratorAggregate;
9
use kalanis\Restful\Validation\Error;
10
use kalanis\Restful\Validation\IDataProvider;
11
use kalanis\Restful\Validation\IField;
12
use kalanis\Restful\Validation\IValidationScope;
13
use kalanis\Restful\Validation\IValidationScopeFactory;
14
use Nette\MemberAccessException;
15
16
17
/**
18
 * Request Input parser
19
 * @package kalanis\Restful\Http
20
 * @template TK of string
21
 * @template TVal of mixed
22
 * @implements IteratorAggregate<TK, TVal>
23
 */
24 1
class Input implements IteratorAggregate, IInput, IDataProvider
25
{
26
27
    private ?IValidationScope $validationScope = null;
28
29
    /**
30
     * @param IValidationScopeFactory $validationScopeFactory
31
     * @param array<TK, TVal> $data
32
     */
33 1
    public function __construct(
34
        private readonly IValidationScopeFactory $validationScopeFactory,
35
        private array                            $data = [],
36
    )
37
    {
38 1
    }
39
40
    /**
41
     * @param string $name
42
     * @throws Exception|MemberAccessException
43
     * @return mixed
44
     *
45
     */
46
    public function &__get(string $name)
47
    {
48 1
        $data = $this->getData();
49 1
        if (array_key_exists($name, $data)) {
50 1
            return $data[$name];
51
        }
52 1
        throw new MemberAccessException('Cannot read an undeclared property ' . static::class . '::$' . $name . '.');
53
    }
54
55
    /**
56
     * Get parsed input data
57
     * @return array<TK, TVal>
58
     */
59
    public function getData(): array
60
    {
61 1
        return $this->data;
62
    }
63
64
    /**
65
     * Set input data
66
     * @param array<TK, TVal> $data
67
     * @return $this
68
     */
69
    public function setData(array $data): static
70
    {
71 1
        $this->data = $data;
72 1
        return $this;
73
    }
74
75
    /**
76
     * @param string $name
77
     * @return bool
78
     */
79
    public function __isset(string $name)
80
    {
81
        $data = $this->getData();
82
        return array_key_exists($name, $data);
83
    }
84
85
    /**
86
     * Get input data iterator
87
     * @return ArrayIterator<TK, TVal>
88
     */
89
    public function getIterator(): ArrayIterator
90
    {
91
        return new ArrayIterator($this->getData());
92
    }
93
94
    /**
95
     * Get validation field
96
     * @param string $name
97
     * @return IField
98
     */
99
    public function field(string $name): IField
100
    {
101 1
        return $this->getValidationScope()->field($name);
102
    }
103
104
    /**
105
     * Get validation scope
106
     * @return IValidationScope
107
     */
108
    public function getValidationScope(): IValidationScope
109
    {
110 1
        if (empty($this->validationScope)) {
111 1
            $this->validationScope = $this->validationScopeFactory->create();
112
        }
113 1
        return $this->validationScope;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->validationScope could return the type null which is incompatible with the type-hinted return kalanis\Restful\Validation\IValidationScope. Consider adding an additional type-check to rule them out.
Loading history...
114
    }
115
116
    /**
117
     * Is input valid
118
     * @return bool
119
     */
120
    public function isValid(): bool
121
    {
122 1
        return !$this->validate();
123
    }
124
125
    /**
126
     * Validate input data
127
     * @return array<Error>
128
     */
129
    public function validate(): array
130
    {
131 1
        return $this->getValidationScope()->validate($this->getData());
132
    }
133
}
134