Test Failed
Push — master ( 067306...cbca33 )
by Taosikai
02:30
created

UploadHandler   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 13
eloc 36
dl 0
loc 130
rs 10
c 3
b 0
f 0

7 Methods

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