Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
13 | class MediaController extends Controller |
||
14 | { |
||
15 | /** |
||
16 | * Filesystem interface. |
||
17 | * |
||
18 | * @var \Illuminate\Contracts\Filesystem\Filesystem |
||
19 | */ |
||
20 | protected $storage; |
||
21 | |||
22 | /** |
||
23 | * Image manager. |
||
24 | * |
||
25 | * @var \Intervention\Image\ImageManager |
||
26 | */ |
||
27 | protected $image; |
||
28 | |||
29 | /** |
||
30 | * Config repository. |
||
31 | * |
||
32 | * @var \Illuminate\Config\Repository |
||
33 | */ |
||
34 | protected $config; |
||
35 | |||
36 | /** |
||
37 | * Media manager template. |
||
38 | * |
||
39 | * @var string |
||
40 | */ |
||
41 | protected $template = 'admin::layouts.master'; |
||
42 | |||
43 | /** |
||
44 | * Files listing filter. |
||
45 | * |
||
46 | * @var null|string |
||
47 | */ |
||
48 | protected $filter = null; |
||
49 | |||
50 | /** |
||
51 | * Current dir the user is browsing. |
||
52 | * |
||
53 | * @var string |
||
54 | */ |
||
55 | protected $currentDir; |
||
56 | |||
57 | /** |
||
58 | * @param \Illuminate\Contracts\Filesystem\Filesystem $storage |
||
59 | * @param \Intervention\Image\ImageManager $image |
||
60 | * @param \Illuminate\Config\Repository $config |
||
61 | */ |
||
62 | public function __construct(Filesystem $storage, ImageManager $image, Repository $config) |
||
68 | |||
69 | /** |
||
70 | * Display media browser from CKEditor. |
||
71 | * |
||
72 | * @param \Illuminate\Http\Request $request |
||
73 | * @param string|null $filter |
||
74 | * @return \Illuminate\Http\Response |
||
75 | */ |
||
76 | public function browse(Request $request, $filter = null) |
||
83 | |||
84 | /** |
||
85 | * Display a listing of the resource. |
||
86 | * |
||
87 | * @param \Illuminate\Http\Request $request |
||
88 | * @return \Illuminate\Http\Response |
||
89 | */ |
||
90 | public function index(Request $request) |
||
120 | |||
121 | /** |
||
122 | * Get root directory. |
||
123 | * |
||
124 | * @return string |
||
125 | */ |
||
126 | protected function getRootDir() |
||
130 | |||
131 | /** |
||
132 | * Build files and directory collection for the current directory. |
||
133 | * |
||
134 | * @return \Illuminate\Database\Eloquent\Collection |
||
135 | */ |
||
136 | protected function buildFileAndDirectoryListing() |
||
203 | |||
204 | /** |
||
205 | * Scan files of the given directory. |
||
206 | * |
||
207 | * @param $current_directory |
||
208 | * @return \Illuminate\Support\Collection |
||
209 | */ |
||
210 | protected function scanFiles($current_directory) |
||
227 | |||
228 | /** |
||
229 | * Build thumbnails for each files that is image type. |
||
230 | * |
||
231 | * @param \Illuminate\Support\Collection $files |
||
232 | * @return array |
||
233 | */ |
||
234 | protected function buildThumbnails($files) |
||
248 | |||
249 | /** |
||
250 | * Scan the directory. |
||
251 | * |
||
252 | * @param string $dir |
||
253 | * @return \Illuminate\Support\Collection |
||
254 | */ |
||
255 | protected function scanDirectory($dir) |
||
259 | |||
260 | /** |
||
261 | * Build the directory lists. |
||
262 | * |
||
263 | * @param \Illuminate\Support\Collection $directories |
||
264 | * @param string $parent |
||
265 | * @return string |
||
266 | */ |
||
267 | protected function buildDirectory($directories, $parent) |
||
291 | |||
292 | /** |
||
293 | * Upload a file. |
||
294 | * |
||
295 | * @param \Illuminate\Http\Request $request |
||
296 | * @return \Illuminate\Http\RedirectResponse |
||
297 | */ |
||
298 | public function addFile(Request $request) |
||
299 | { |
||
300 | $maxSize = $this->config->get('media.max_file_size', 3); |
||
301 | $validator = $this->getValidationFactory()->make($request->all(), [ |
||
302 | 'file' => 'required|mimes:' . $this->getAcceptedFiles() . '|max:' . $maxSize * 1024, |
||
303 | ]); |
||
304 | |||
305 | if ($validator->fails()) { |
||
306 | return response($validator->getMessageBag()->get('file')[0], 500); |
||
307 | } |
||
308 | |||
309 | $filename = trim($request->file('file')->getClientOriginalName()); |
||
310 | if ($this->storage->exists($request->input('current_directory') . '/' . $filename)) { |
||
311 | return response($filename . " already exists.", 500); |
||
312 | } |
||
313 | |||
314 | $this->storage->put( |
||
315 | $request->input('current_directory') . '/' . $filename, |
||
316 | file_get_contents($request->file('file')) |
||
317 | ); |
||
318 | |||
319 | return redirect()->back(); |
||
320 | } |
||
321 | |||
322 | /** |
||
323 | * Get accepted files for upload. |
||
324 | * |
||
325 | * @return string |
||
326 | */ |
||
327 | protected function getAcceptedFiles() |
||
335 | |||
336 | /** |
||
337 | * Create a folder. |
||
338 | * |
||
339 | * @param \Illuminate\Http\Request $request |
||
340 | * @return \Illuminate\Http\RedirectResponse |
||
341 | */ |
||
342 | public function addFolder(Request $request) |
||
368 | |||
369 | /** |
||
370 | * Delete a file(/s) and/or folder(/s). |
||
371 | * |
||
372 | * @param \Illuminate\Http\Request $request |
||
373 | * @return \Illuminate\Http\RedirectResponse |
||
374 | */ |
||
375 | public function deleteMedia(Request $request) |
||
410 | |||
411 | /** |
||
412 | * Delete a single directory from request. |
||
413 | * |
||
414 | * @param \Illuminate\Http\Request $request |
||
415 | * @return \Illuminate\Http\JsonResponse |
||
416 | */ |
||
417 | View Code Duplication | protected function deleteDirectory(Request $request) |
|
428 | |||
429 | /** |
||
430 | * Delete a single file from request. |
||
431 | * |
||
432 | * @param \Illuminate\Http\Request $request |
||
433 | * @return \Illuminate\Http\JsonResponse |
||
434 | */ |
||
435 | View Code Duplication | protected function deleteFile(Request $request) |
|
446 | } |
||
447 |
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.
For example, imagine you have a variable
$accountId
that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to theid
property of an instance of theAccount
class. This class holds a proper account, so the id value must no longer be false.Either this assignment is in error or a type check should be added for that assignment.