Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 45
FilesManager
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
462
0.00% covered (danger)
0.00%
0 / 45
 from
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 to
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 checkDiskSetted
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 5
 directory
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 9
 file
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 9
 put
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 7
 allDestinationFiles
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 cleanTo
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 3
 cleanFrom
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 3
 createParentDir
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 4
1<?php
2namespace Qmp\Laravel\ToolsLaravel\FilesManager;
3
4
5use Illuminate\Support\Facades\File;
6use Illuminate\Filesystem\FilesystemAdapter;
7
8/**
9 * @example (new FileManager())
10 *              ->from(Storage::disk('disk_from'))
11 *              ->to(Storage::disk('disk_to))
12 *              ->directory('from_path_folder', 'to_path_folder', true)
13 *              ->file('from_path_file', 'to_path_file', false, true)
14 *              ->put('to_path_folder', new HttpFile('/index.html'), 'new_index.html')
15 *              ->allDestinationFiles('to_path_folder');
16 */
17class FilesManager
18{
19    /**
20     * @var FilesystemAdapter
21     */
22    protected $fromDisk;
23
24    /**
25     * @var FilesystemAdapter
26     */
27    protected $toDisk;
28
29    /**
30     * @param FilesystemAdapter $storageDisk
31     * 
32     * @return FilesManager
33     */
34    public function from(FilesystemAdapter $storageDisk): FilesManager
35    {
36        $this->fromDisk = $storageDisk;
37
38        return $this;
39    }
40    
41    /**
42     * @param FilesystemAdapter $storageDisk
43     * 
44     * @return FilesManager
45     */
46    public function to(FilesystemAdapter $storageDisk): FilesManager
47    {
48        $this->toDisk = $storageDisk;
49
50        return $this;
51    }
52
53    /**
54     * @throws FilesManagerException
55     */
56    protected function checkDiskSetted()
57    {
58        if (!$this->fromDisk) {
59            throw new FilesManagerException('From disk have to be setted.');
60        }
61
62        if (!$this->toDisk) {
63            throw new FilesManagerException('To disk have to be setted.');
64        }
65    }
66
67    /**
68     * @param string $fromPath
69     * @param string $toPath
70     * @param bool $cleanToBefore = false
71     * @param bool $cleanFromAfter = false
72     * 
73     * @return FilesManager
74     */
75    public function directory(string $fromPath, string $toPath, bool $cleanToBefore = false, bool $cleanFromAfter = false): FilesManager
76    {
77        $this->checkDiskSetted();
78
79        $this->cleanTo($toPath, $cleanToBefore);
80        $this->createParentDir($toPath);
81        
82        if ($this->toDisk->exists($fromPath)) {
83            File::copyDirectory(
84                $this->fromDisk->path($fromPath),
85                $this->toDisk->path($toPath)
86            );
87    
88            $this->cleanFrom($fromPath, $cleanFromAfter);
89        }
90
91        return $this;
92    }
93
94    /**
95     * @param string $fromPath
96     * @param string $toPath
97     * @param bool $cleanToBefore = false
98     * @param bool $cleanFromAfter = false
99     * 
100     * @return FilesManager
101     */
102    public function file(string $fromPath, string $toPath, bool $cleanToBefore = false, bool $cleanFromAfter = false) : FilesManager
103    {
104        $this->checkDiskSetted();
105
106        $this->cleanTo($toPath, $cleanToBefore);
107        $this->createParentDir($toPath);
108
109        if ($this->fromDisk->exists($fromPath)) {
110            File::copy(
111                $this->fromDisk->path($fromPath),
112                $this->toDisk->path($toPath)
113            );
114
115            $this->cleanFrom($fromPath, $cleanFromAfter);
116        }
117
118        return $this;
119    }
120
121    /**
122     * @param string $toPath
123     * @param \SplFileInfo $file 
124     * @param string $filename = null
125     * @param bool $cleanToBefore = false
126     * 
127     * @return FilesManager
128     */
129    public function put(string $toPath, \SplFileInfo $file, string $filename = null, bool $cleanToBefore = false) : FilesManager
130    {
131        $this->checkDiskSetted();
132
133        $this->cleanTo($toPath, $cleanToBefore);
134        $this->createParentDir($toPath);
135
136        if ($filename) {
137            $this->toDisk->putFileAs($toPath, $file, $filename);
138        } else {
139            $this->toDisk->putFile($toPath, $file);
140        }        
141
142        return $this;
143    }
144    
145    /**
146     * @param string $toPath
147     * 
148     * @return array
149     */
150    public function allDestinationFiles(string $toPath)  : array
151    {
152        return $this->toDisk->allfiles($toPath);
153    }
154
155    /**
156     * @param string $toPath
157     * @param bool $cleanTo = false
158     */
159    protected function cleanTo(string $toPath, bool $cleanTo = false)
160    {
161        if ($cleanTo && $this->toDisk->exists($toPath)) {
162            $this->toDisk->delete($toPath);
163        } 
164    }
165
166    /**
167     * @param string $fromPath
168     * @param bool $cleanFromAfter = false
169     */
170    protected function cleanFrom(string $fromPath, bool $cleanTo = false)
171    {
172        if ($cleanTo) {
173            $this->fromDisk->delete($fromPath);
174        }
175    }
176
177    /**
178     * @param string $toPath
179     */
180    protected function createParentDir(string $toPath)
181    {
182        $parentPath = implode('/', array_slice(explode('/', $toPath), 0, -1));
183        if ($parentPath !== $toPath && strlen($parentPath) && !$this->toDisk->exists($parentPath)) {
184            $this->toDisk->makeDirectory($parentPath, 0775, true);
185        }
186    }
187}