Passed
Pull Request — master (#4)
by
unknown
02:35
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));
0 ignored issues
show
Bug introduced by
$this->createUploadedFiles($request) of type Symfony\Component\HttpFoundation\FileBag is incompatible with the type array expected by parameter $uploadedFiles of Slince\Upload\UploadHand...:processUploadedFiles(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

95
        return $this->processUploadedFiles(/** @scrutinizer ignore-type */ $this->createUploadedFiles($request));
Loading history...
96
    }
97
98
    protected function processUploadedFiles(array $uploadedFiles): array
99
    {
100
        $files = [];
101
        foreach ($uploadedFiles as $name => $uploadedFileItem) {
102
            if (is_array($uploadedFileItem)) {
103
                $files[$name] = $this->processUploadedFiles($uploadedFileItem);
104
            } else {
105
                $files[$name] = $this->processUploadedFile($uploadedFileItem);
106
            }
107
        }
108
        return $files;
109
    }
110
111
    protected function processUploadedFile(UploadedFile $uploadedFile): File
112
    {
113
        $name = $this->namer->generate($uploadedFile);
114
        try {
115
            // validate the file
116
            $this->validator->validate($uploadedFile);
117
            $data = $this->filesystem
118
                ->upload($name, $uploadedFile, $this->overwrite);
119
120
            $file = new File($uploadedFile, $name, true, $data);
121
        } catch (\Exception $exception) {
122
            $file = new File($uploadedFile, $name, false, null, $exception);
123
        }
124
125
        $this->processor->process($file);
126
127
        return $file;
128
    }
129
130
    /**
131
     * @param SymfonyRequest|null $request
132
     * @return FileBag
133
     */
134
    protected function createUploadedFiles(?SymfonyRequest $request = null)
135
    {
136
        if ($request instanceof SymfonyRequest) {
137
            $files = $request->files;
138
        } else {
139
            $files = new FileBag($_FILES);
140
        }
141
        return $this->uploadedFiles = $files;
142
    }
143
}
144