Skip to content

Commit 43c7f5a

Browse files
committed
Add globals provider component
1 parent a737f66 commit 43c7f5a

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed

Writerside/boson.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<toc-element topic="cpu-info.md" />
5656
<toc-element topic="weak-types.md" />
5757
<toc-element topic="static-files.md" />
58+
<toc-element topic="globals-provider.md" />
5859
</toc-element>
5960
<toc-element toc-title="Integrations">
6061
<toc-element topic="symfony-adapter.md"
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# PHP Globals Provider
2+
3+
<show-structure for="chapter" depth="2"/>
4+
5+
The component provides the ability to manage global PHP variables and
6+
obtain their state depending on WebView requests.
7+
8+
## Installation
9+
10+
<tldr>
11+
<p>
12+
Via <a href="https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies">Composer</a>:
13+
</p>
14+
<p>
15+
<code lang="bash">composer require boson-php/globals-provider</code>
16+
</p>
17+
</tldr>
18+
19+
**Requirements:**
20+
21+
* `PHP ^8.4`
22+
23+
## Usage
24+
25+
The component provides several implementations of
26+
`ServerGlobalsProviderInterface` for managing PHP `$_SERVER` superglobals:
27+
28+
### DefaultServerGlobalsProvider
29+
30+
The default provider that handles basic request-aware parameters:
31+
32+
```php
33+
use Boson\Component\GlobalsProvider\DefaultServerGlobalsProvider;
34+
use Boson\Component\Http\Request;
35+
36+
$provider = new DefaultServerGlobalsProvider();
37+
38+
$globals = $provider->getServerGlobals(new Request(
39+
method: 'POST',
40+
url: 'https://example.com/path?query=value',
41+
headers: ['Host' => 'example.com']
42+
));
43+
44+
//
45+
// Expected output:
46+
//
47+
// array:9 [
48+
// "REQUEST_TIME_FLOAT" => 1749130915.4316
49+
// "REQUEST_TIME" => 1749130915
50+
// "REQUEST_METHOD" => "POST"
51+
// "QUERY_STRING" => "query=value"
52+
// "PATH_INFO" => "/path"
53+
// "REMOTE_ADDR" => "example.com"
54+
// "REMOTE_PORT" => 80
55+
// "REQUEST_URI" => "/path?query=value"
56+
// "HTTP_HOST" => "example.com"
57+
// ]
58+
//
59+
```
60+
61+
This provider automatically sets request-dependent variables:
62+
- Request time parameters (`REQUEST_TIME`, `REQUEST_TIME_FLOAT`)
63+
- Request information (`REQUEST_METHOD`, `REQUEST_URI`, `HTTP_HOST`, etc.)
64+
- Request headers (converted to uppercase with `HTTP_` prefix)
65+
66+
#### PSR-20 Clock
67+
68+
The `DefaultServerGlobalsProvider` supports custom time handling
69+
through PSR-20 Clock interface:
70+
71+
```php
72+
use Boson\Component\GlobalsProvider\DefaultServerGlobalsProvider;
73+
use Psr\Clock\ClockInterface;
74+
75+
class CustomClock implements ClockInterface
76+
{
77+
public function now(): \DateTimeImmutable
78+
{
79+
return new \DateTimeImmutable('2024-01-01 12:00:00');
80+
}
81+
}
82+
83+
$provider = new DefaultServerGlobalsProvider(
84+
clock: new CustomClock(),
85+
);
86+
```
87+
88+
The PSR-20 Clock component is used to generate the `REQUEST_TIME`
89+
and `REQUEST_TIME_FLOAT` parameters.
90+
91+
```php
92+
[
93+
"REQUEST_TIME_FLOAT" => 1749130915.4316,
94+
"REQUEST_TIME" => 1749130915,
95+
// ...
96+
]
97+
```
98+
99+
This allows for consistent time-based testing and custom time
100+
handling in your application.
101+
102+
### StaticServerGlobalsProvider
103+
104+
Provides constant server parameters that are independent of the request:
105+
106+
```php
107+
use Boson\Component\GlobalsProvider\StaticServerGlobalsProvider;
108+
109+
// With default superglobal $_SERVER values
110+
$provider = new StaticServerGlobalsProvider();
111+
112+
// Or with custom values
113+
$provider = new StaticServerGlobalsProvider([
114+
'DOCUMENT_ROOT' => '/custom/root',
115+
'SERVER_NAME' => 'example.com',
116+
'SERVER_PORT' => '8080',
117+
'SERVER_SOFTWARE' => 'Custom Server'
118+
]);
119+
```
120+
121+
The provider ensures:
122+
- Valid document root (from `SCRIPT_FILENAME` or `DOCUMENT_ROOT`)
123+
- Default server name (`SERVER_NAME`)
124+
- Default server port (`SERVER_PORT`)
125+
- Default server software (`SERVER_SOFTWARE`)
126+
- etc...
127+
128+
### CompoundServerGlobalsProvider
129+
130+
Combines multiple providers into a single one:
131+
132+
```php
133+
use Boson\Component\GlobalsProvider\CompoundServerGlobalsProvider;
134+
use Boson\Component\GlobalsProvider\DefaultServerGlobalsProvider;
135+
use Boson\Component\GlobalsProvider\StaticServerGlobalsProvider;
136+
137+
$providers = [
138+
// PHP default $_SERVER superglobals provider
139+
new StaticServerGlobalsProvider(),
140+
// Request-aware $_SERVER superglobals provider
141+
new DefaultServerGlobalsProvider(),
142+
// Custom superglobals provider
143+
new StaticServerGlobalsProvider([
144+
'SERVER_SOFTWARE' => 'Custom Server'
145+
]),
146+
];
147+
148+
$provider = new CompoundServerGlobalsProvider($providers);
149+
```
150+
151+
The compound provider merges results from all providers in the order they
152+
are provided. Later providers can override values from earlier ones.
153+
154+
### EmptyServerGlobalsProvider
155+
156+
A simple provider that returns an empty array of server globals:
157+
158+
```php
159+
use Boson\Component\GlobalsProvider\EmptyServerGlobalsProvider;
160+
161+
$provider = new EmptyServerGlobalsProvider();
162+
$globals = $provider->getServerGlobals($request); // Returns []
163+
```

0 commit comments

Comments
 (0)