Passed
Push — master ( 6c10ed...067306 )
by Taosikai
05:29 queued 02:54
created

UploadHandler::getProcessor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Slince\Upload;
4
5
use Slince\Upload\Filesystem\FilesystemInterface;
6
use Slince\Upload\Naming\NamerInterface;
7
use Symfony\Component\HttpFoundation\File\UploadedFile;
8
use Symfony\Component\HttpFoundation\FileBag;
9
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
10
11
class UploadHandler
12
{
13
    /**
14
     * @var NamerInterface
15
     */
16
    protected $namer;
17
18
    /**
19
     * @var FilesystemInterface
20
     */
21
    protected $filesystem;
22
23
    /**
24
     * @var Validator
25
     */
26
    protected $validator;
27
28
    /**
29
     * @var FileProcessor
30
     */
31
    protected $processor;
32
33
    /**
34
     * @var boolean
35
     */
36
    protected $overwrite;
37
38
    /**
39
     * @var FileBag
40
     */
41
    protected $uploadedFiles;
42
43
    public function __construct(
44
        FilesystemInterface $filesystem,
45
        NamerInterface $namer,
46
        bool $overwrite = false
47
    ) {
48
        $this->filesystem = $filesystem;
49
        $this->namer = $namer;
50
        $this->overwrite = $overwrite;
51
        $this->validator = new Validator();
52
        $this->processor = new FileProcessor();
53
    }
54
55
    /**
56
     * Gets the validator
57
     *
58
     * @return Validator
59
     */
60
    public function getValidator(): Validator
61
    {
62
        return $this->validator;
63
    }
64
65
    public function getProcessor(): FileProcessor
66
    {
67
        return $this->processor;
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
     * @param FileBag|array $uploadedFiles
100
     * @return array
101
     */
102
    protected function processUploadedFiles($uploadedFiles): array
103
    {
104
        $files = [];
105
        foreach ($uploadedFiles as $name => $uploadedFileItem) {
106
            if (is_array($uploadedFileItem)) {
107
                $files[$name] = $this->processUploadedFiles($uploadedFileItem);
108
            } else {
109
                $files[$name] = $this->processUploadedFile($uploadedFileItem);
110
            }
111
        }
112
        return $files;
113
    }
114
115
    protected function processUploadedFile(UploadedFile $uploadedFile): File
116
    {
117
        $name = $this->namer->generate($uploadedFile);
118
        try {
119
            // validate the file
120
            $this->validator->validate($uploadedFile);
121
            $data = $this->filesystem
122
                ->upload($name, $uploadedFile, $this->overwrite);
123
124
            $file = new File($uploadedFile, $name, true, $data);
125
        } catch (\Exception $exception) {
126
            $file = new File($uploadedFile, $name, false, null, $exception);
127
        }
128
129
        $this->processor->process($file);
130
131
        return $file;
132
    }
133
134
    /**
135
     * @param SymfonyRequest|null $request
136
     * @return FileBag
137
     */
138
    protected function createUploadedFiles(?SymfonyRequest $request = null)
139
    {
140
        if ($request instanceof SymfonyRequest) {
141
            $files = $request->files;
142
        } else {
143
            $files = new FileBag($_FILES);
144
        }
145
        return $this->uploadedFiles = $files;
146
    }
147
}
148