UploadHandler::__construct()   A
last analyzed

Complexity

Conditions 3
Paths 1

Size

Total Lines 12
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 5
dl 0
loc 12
rs 10
c 2
b 0
f 0
cc 3
nc 1
nop 5
1
<?php
2
3
namespace Slince\Upload;
4
5
use Exception;
6
use Slince\Upload\Filesystem\FilesystemInterface;
7
use Slince\Upload\Naming\NamerInterface;
8
use Slince\Upload\Processor\ChainProcessor;
9
use Slince\Upload\Processor\ProcessorInterface;
10
use Symfony\Component\HttpFoundation\File\UploadedFile;
11
use Symfony\Component\HttpFoundation\FileBag;
12
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
13
14
class UploadHandler
15
{
16
    /**
17
     * @var NamerInterface
18
     */
19
    protected $namer;
20
21
    /**
22
     * @var FilesystemInterface
23
     */
24
    protected $filesystem;
25
26
    /**
27
     * @var Validator
28
     */
29
    protected $validator;
30
31
    /**
32
     * @var ProcessorInterface
33
     */
34
    protected $processor;
35
36
    /**
37
     * @var boolean
38
     */
39
    protected $overwrite;
40
41
    /**
42
     * @var FileBag
43
     */
44
    protected $uploadedFiles;
45
46
    public function __construct(
47
        FilesystemInterface $filesystem,
48
        NamerInterface $namer,
49
        Validator $validator = null,
50
        ProcessorInterface $processor = null,
51
        bool $overwrite = false
52
    ) {
53
        $this->filesystem = $filesystem;
54
        $this->namer = $namer;
55
        $this->validator = $validator ?: new Validator();
56
        $this->processor = $processor ?: new ChainProcessor();
57
        $this->overwrite = $overwrite;
58
    }
59
60
    /**
61
     * Gets the validator.
62
     *
63
     * @return Validator
64
     */
65
    public function getValidator(): Validator
66
    {
67
        return $this->validator;
68
    }
69
70
    /**
71
     * Gets all uploaded files.
72
     *
73
     * [
74
     *     'file1' => UploadedFile,
75
     *     'file2' => [
76
     *         UploadedFile,
77
     *         UploadedFile
78
     *     ],
79
     * ]
80
     * @return UploadedFile[]
81
     */
82
    public function getUploadedFiles(): array
83
    {
84
        return $this->uploadedFiles->all();
85
    }
86
87
    /**
88
     * Process request
89
     * @param SymfonyRequest|null $request
90
     *
91
     * @return File[]
92
     */
93
    public function handle(?SymfonyRequest $request = null): array
94
    {
95
        return $this->processUploadedFiles($this->createUploadedFiles($request));
96
    }
97
98
    /**
99
     * Clear files
100
     *
101
     * @param File[] $files
102
     * @return bool
103
     */
104
    public function clear(array $files): bool
105
    {
106
        foreach ($files as $file) {
107
            if (is_array($file)) {
108
                $this->clear($file);
109
            } else {
110
                $this->filesystem->delete($file);
111
            }
112
        }
113
114
        return true;
115
    }
116
117
    /**
118
     * @param FileBag|array $uploadedFiles
119
     * @return array
120
     */
121
    protected function processUploadedFiles($uploadedFiles): array
122
    {
123
        $files = [];
124
        foreach ($uploadedFiles as $name => $uploadedFile) {
125
            if (!$uploadedFile) {
126
                continue;
127
            } elseif (is_array($uploadedFile)) {
128
                $files[$name] = $this->processUploadedFiles($uploadedFile);
129
            } else {
130
                $files[$name] = $this->processUploadedFile($uploadedFile);
131
            }
132
        }
133
        return $files;
134
    }
135
136
    protected function processUploadedFile(UploadedFile $uploadedFile): File
137
    {
138
        $name = $this->namer->generate($uploadedFile);
139
        try {
140
            // validate the file
141
            $this->validator->validate($uploadedFile);
142
            $data = $this->filesystem
143
                ->upload($name, $uploadedFile, $this->overwrite);
144
145
            $file = new File($uploadedFile, $name, true, $data);
146
        } catch (Exception $exception) {
147
            $file = new File($uploadedFile, $name, false, null, $exception);
148
        }
149
150
        return $this->processor->process($file);
151
    }
152
153
    /**
154
     * @param SymfonyRequest|null $request
155
     * @return FileBag
156
     */
157
    protected function createUploadedFiles(?SymfonyRequest $request = null): FileBag
158
    {
159
        if ($request instanceof SymfonyRequest) {
160
            $files = $request->files;
161
        } else {
162
            $files = new FileBag($_FILES);
163
        }
164
        return $this->uploadedFiles = $files;
165
    }
166
}
167