Skip to content

Commit c15b522

Browse files
committed
Create UploadedFilesTrait.php
1 parent 13f1553 commit c15b522

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed

src/Traits/UploadedFilesTrait.php

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?php
2+
/**
3+
* Трейт загруженных файлов.
4+
* @package evas-php\evas-http
5+
* @author Egor Vasyakin <[email protected]>
6+
*/
7+
namespace Evas\Http\Traits;
8+
9+
use \InvalidArgumentException;
10+
use Evas\Http\Interfaces\UploadedFileInterface;
11+
use Evas\Http\UploadedFile;
12+
13+
trait UploadedFilesTrait
14+
{
15+
/** @var array список загруженных файлов */
16+
protected $uploadedFiles = [];
17+
18+
/**
19+
* Нормализация загруженных файлов.
20+
* @param array загруженные файлы
21+
* @return array нормализованные загруженные файлы
22+
* @throws InvalidArgumentException
23+
*/
24+
public static function normalizeFiles(array $files): array
25+
{
26+
$normalized = [];
27+
foreach ($files as $key => $value) {
28+
if ($value instanceof UploadedFileInterface) {
29+
$normalized[$key] = $value;
30+
} else if (is_array($value)) {
31+
$normalized[$key] = isset($value['tmp_name'])
32+
? self::createUploadedFileFromSpec($value)
33+
: self::normalizeFiles($value);
34+
} else {
35+
throw new InvalidArgumentException('Invalid value in files specification');
36+
}
37+
}
38+
return $normalized;
39+
}
40+
41+
/**
42+
* Создание объекта загруженного файла или массива объектов.
43+
* @param array спецификация файла или файлов
44+
* @return array|UploadedFileInterface|null
45+
*/
46+
private static function createUploadedFileFromSpec(array $spec)
47+
{
48+
if (is_array($spec['tmp_name'])) {
49+
return self::normalizeNestedFileSpec($spec);
50+
}
51+
if (empty($spec['tmp_name'])) {
52+
return null;
53+
}
54+
return new UploadedFile($spec);
55+
// return new UploadedFile(
56+
// $value['tmp_name'],
57+
// (int) $value['size'],
58+
// (int) $value['error'],
59+
// $value['name'],
60+
// $value['type']
61+
// );
62+
}
63+
64+
/**
65+
* Нормализация массива спецификаций файлов.
66+
* @param array спецификации файлов
67+
* @return UploadedFileInterface[] загруженные файлы
68+
*/
69+
private static function normalizeNestedFileSpec(array $files)
70+
{
71+
$normalized = [];
72+
foreach (array_keys($files['tmp_name']) as $key) {
73+
if (!empty($files['tmp_name'][$key])) {
74+
$spec = [
75+
'tmp_name' => $files['tmp_name'][$key],
76+
'size' => $files['size'][$key],
77+
'error' => $files['error'][$key],
78+
'name' => $files['name'][$key],
79+
'type' => $files['type'][$key],
80+
];
81+
$normalized[$key] = self::createUploadedFileFromSpec($spec);
82+
}
83+
}
84+
return $normalized;
85+
}
86+
87+
/**
88+
* Добавление массива загруженных файлов.
89+
* @param array
90+
* @return self
91+
*/
92+
public function withUploadedFiles(array $files): object
93+
{
94+
$this->uploadedFiles = static::normalizeFiles($files);
95+
return $this;
96+
}
97+
98+
/**
99+
* Проверка наличия загруженных файлов.
100+
* @return bool
101+
*/
102+
public function hasUploadedFiles(): bool
103+
{
104+
return empty($this->uploadedFiles) ? false : true;
105+
}
106+
107+
/**
108+
* Получение массива загруженных файлов.
109+
* @return array
110+
*/
111+
public function getUploadedFiles(): array
112+
{
113+
return $this->uploadedFiles;
114+
}
115+
116+
/**
117+
* Проверка наличия загруженного файла или массива файлов по имени.
118+
* @param string имя
119+
* @return bool
120+
*/
121+
public function hasUploadedFile(string $name): bool
122+
{
123+
return empty($this->uploadedFiles[$name]) ? false : true;
124+
}
125+
126+
/**
127+
* Получение загруженного файла или массива файлов по имени.
128+
* @param string имя
129+
* @return UploadedFile|array|null
130+
*/
131+
public function getUploadedFile(string $name)
132+
{
133+
return $this->uploadedFiles[$name] ?? null;
134+
}
135+
}

0 commit comments

Comments
 (0)