Skip to content

Commit f5c0d52

Browse files
Merge branch 'development' into stable
2 parents fbc37eb + d51bf4a commit f5c0d52

File tree

5 files changed

+273
-1
lines changed

5 files changed

+273
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/vendor/

README.md

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,38 @@
11
# php-headers
2-
Компонент для работы с заголовками в PHP
2+
3+
Компонент для раб оты с заголовками в PHP
4+
5+
# Структура
6+
7+
```
8+
src/
9+
--- interfaces/
10+
--- Headers.php
11+
```
12+
13+
В директории `interfaces` хранятся необходимые интерфейсы, которые необходимо имплементировать в при реализации
14+
собственного класса `Headers`.
15+
16+
Класс `Headers` реализует интерфейс `HeadersInterface` для управления заголовками.
17+
18+
# Доступные методы
19+
20+
| Метод | Аргументы | Возвращаемые данные | Исключения | Описание |
21+
|---------------------|-----------------------------|---------------------|--------------------------|-----------------------------------------------------------------------------|
22+
| set(array $params) | Заголовок(и) [key => value] | void | | Устанавливает заголовок(и) |
23+
| add(array $params) | Заголовок(и) [key => value] | void | | Добавляет заголовок. Если заголовок уже существует, то он будет перезаписан |
24+
| remove(string $key) | Заголовок | void | | Удаляет заголовок |
25+
| removeAll | | void | | Удаляет все заголовки |
26+
| has(string $key) | Заголовок | bool | | Проверяет наличие заголовка. Проверка идет на наличие ключа и значения |
27+
| get(string $key) | Заголовок | string | InvalidArgumentException | Получает значение заголовка |
28+
| getAll | | | | Получает все заголовки |
29+
30+
# Конакты
31+
32+
Вы можете связаться со мной в социальной сети ВКонтакте: [ВКонтакте: Максим Епихин](https://vk.com/maximepihin)
33+
34+
Если удобно писать на почту, то можете воспользоваться этим адресом: mepihindeveloper@gmail.com
35+
36+
Мой канал на YouTube, который посвящен разработке веб и игровых проектов: [YouTube: Максим Епихин](https://www.youtube.com/channel/UCKusRcoHUy6T4sei-rVzCqQ)
37+
38+
Поддержать меня можно переводом на Яндекс.Деньги: [Денежный перевод](https://yoomoney.ru/to/410012382226565)

composer.json

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "mepihindeveloper/php-headers",
3+
"description": "Component for working with headers",
4+
"type": "library",
5+
"license": "MIT",
6+
"keywords": [
7+
"component",
8+
"class",
9+
"php",
10+
"headers"
11+
],
12+
"authors": [
13+
{
14+
"name": "mepihindeveloper",
15+
"email": "mepihindeveloper@gmail.com"
16+
}
17+
],
18+
"require": {
19+
"php": "^7.4|^8.0"
20+
},
21+
"autoload": {
22+
"psr-4": {
23+
"mepihindeveloper\\components\\": "src/"
24+
}
25+
},
26+
"minimum-stability": "dev",
27+
"prefer-stable": true
28+
}

src/Headers.php

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
<?php
2+
3+
declare(strict_types = 1);
4+
5+
namespace mepihindeveloper\components;
6+
7+
use InvalidArgumentException;
8+
use mepihindeveloper\components\interfaces\HeadersInterface;
9+
10+
/**
11+
* Класс Headers
12+
*
13+
* Реализует управление заголовками запроса
14+
*/
15+
class Headers implements HeadersInterface {
16+
17+
/**
18+
* @var array Заголовки
19+
*/
20+
private array $headers;
21+
22+
public function __construct()
23+
{
24+
$this->headers = $this->getAllHeaders();
25+
}
26+
27+
/**
28+
* Получает все заголовки методами apache и nginx
29+
*
30+
* @return array
31+
*/
32+
private function getAllHeaders(): array
33+
{
34+
if (function_exists('getallheaders')) {
35+
return getallheaders() !== false ? getallheaders() : [];
36+
}
37+
38+
if (!is_array($_SERVER))
39+
{
40+
return [];
41+
}
42+
43+
$headers = [];
44+
45+
foreach ($_SERVER as $name => $value)
46+
{
47+
if (strpos($name, 'HTTP_') === 0)
48+
{
49+
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
50+
}
51+
}
52+
53+
return $headers;
54+
}
55+
56+
/**
57+
* @inheritDoc
58+
*/
59+
public function set(array $params): void {
60+
$this->getAll();
61+
62+
foreach ($params as $header => $value)
63+
{
64+
$this->headers[$header] = $value;
65+
}
66+
67+
$this->add($params);
68+
}
69+
70+
/**
71+
* @inheritDoc
72+
*/
73+
public function add(array $params): void {
74+
foreach ($params as $header => $value)
75+
{
76+
$headerExists = array_key_exists($header, $this->headers);
77+
$this->headers[$header] = $value;
78+
79+
header("{$header}: {$value}", $headerExists);
80+
}
81+
}
82+
83+
/**
84+
* @inheritDoc
85+
*/
86+
public function remove(string $key): void {
87+
$this->getAll();
88+
89+
unset($this->headers[$key]);
90+
header_remove($key);
91+
}
92+
93+
/**
94+
* @inheritDoc
95+
*/
96+
public function removeAll(): void {
97+
$this->headers = [];
98+
99+
header_remove();
100+
}
101+
102+
/**
103+
* @inheritDoc
104+
*/
105+
public function has(string $key): bool {
106+
$this->getAll();
107+
108+
return array_key_exists($key, $this->headers);
109+
}
110+
111+
/**
112+
* @inheritDoc
113+
*/
114+
public function get(string $key): string {
115+
if (!$this->has($key))
116+
{
117+
throw new InvalidArgumentException("Заголоков {$key} отсутсвует.");
118+
}
119+
120+
return $this->headers[$key];
121+
}
122+
123+
/**
124+
* @inheritDoc
125+
*/
126+
public function getAll(): array {
127+
$this->headers = !empty($this->headers) ? $this->headers : $this->getAllHeaders();
128+
129+
return $this->headers;
130+
}
131+
}

src/interfaces/HeadersInterface.php

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types = 1);
4+
5+
namespace mepihindeveloper\components\interfaces;
6+
7+
use InvalidArgumentException;
8+
9+
/**
10+
* Интерфейс HeadersInterface
11+
*
12+
* Декларирует методы обязательные для реализации компонента Headers
13+
*/
14+
interface HeadersInterface {
15+
16+
/**
17+
* Устанавливает заголовок(и)
18+
*
19+
* @param array $params Заголовок(и) [key => value]
20+
*
21+
* @return void
22+
*/
23+
public function set(array $params): void;
24+
25+
/**
26+
* Добавляет заголовок. Если заголовок уже существует, то он будет перезаписан.
27+
*
28+
* @param array $params Заголовки [key => value]
29+
*
30+
* @return void
31+
*/
32+
public function add(array $params): void;
33+
34+
/**
35+
* Удаляет заголовок
36+
*
37+
* @param string $key Заголовок
38+
*
39+
* @return void
40+
*/
41+
public function remove(string $key): void;
42+
43+
/**
44+
* Удаляет все заголовки
45+
*
46+
* @return void
47+
*/
48+
public function removeAll(): void;
49+
50+
/**
51+
* Проверяет наличие заголовка. Проверка идет на наличие ключа и значения
52+
*
53+
* @param string $key Заголовок
54+
*
55+
* @return bool
56+
*/
57+
public function has(string $key): bool;
58+
59+
/**
60+
* Получает значение заголовка
61+
*
62+
* @param string $key Заголовок
63+
*
64+
* @return string
65+
*
66+
* @throws InvalidArgumentException
67+
*/
68+
public function get(string $key): string;
69+
70+
/**
71+
* Получает все заголовки
72+
*
73+
* @return array
74+
*/
75+
public function getAll(): array;
76+
}

0 commit comments

Comments
 (0)