MediaTrait   F
last analyzed

Complexity

Total Complexity 71

Size/Duplication

Total Lines 449
Duplicated Lines 0 %

Test Coverage

Coverage 8.04%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 120
dl 0
loc 449
rs 2.7199
c 2
b 0
f 0
ccs 9
cts 112
cp 0.0804
wmc 71

45 Methods

Rating   Name   Duplication   Size   Complexity  
A getExtension() 0 3 1
A __toString() 0 3 1
A slugifyPreservingExtension() 0 6 1
A setSlugForce() 0 13 3
A getSlugForce() 0 3 1
A setMediaFile() 0 6 2
A removeMainImageFromPages() 0 4 2
A setMimeType() 0 5 1
A getFullPathWebP() 0 5 3
A getMimeType() 0 3 1
A getPageHasMedias() 0 3 1
A setMainColor() 0 5 1
A getMainImagePages() 0 3 1
A getSlug() 0 13 3
A setName() 0 5 1
A setMediaBeforeUpdate() 0 5 1
A setMedia() 0 14 3
A getNameByLocale() 0 5 1
A getMedia() 0 3 1
A getHeight() 0 3 1
A setNames() 0 5 1
A setSlug() 0 17 3
A validate() 0 8 4
A getName() 0 7 4
A getMediaFile() 0 3 1
A getSize() 0 3 1
A getNames() 0 3 3
A getDimensions() 0 3 1
A getRelativeDir() 0 3 1
A getPreviousMimeType() 0 3 1
A setRelativeDir() 0 5 1
A removePageHasMedia() 0 3 1
A setDimensions() 0 11 3
A addPageHasMedia() 0 4 1
A loadFromSrc() 0 10 1
A getMainColorOpposite() 0 7 2
A getFullPath() 0 5 3
A getMediaBeforeUpdate() 0 3 1
A getPath() 0 3 1
A setSize() 0 5 1
A removeExtension() 0 3 1
A setPageHasMedias() 0 5 2
A getMainColor() 0 3 1
A getWidth() 0 3 1
A getRatio() 0 3 1

How to fix   Complexity   

Complex Class

Complex classes like MediaTrait often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use MediaTrait, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace PiedWeb\CMSBundle\Entity;
4
5
use Cocur\Slugify\Slugify;
6
use Doctrine\Common\Collections\ArrayCollection;
7
use Doctrine\ORM\Mapping as ORM;
8
use InvertColor\Color;
9
use Symfony\Component\HttpFoundation\File\File;
10
use Symfony\Component\Validator\Constraints as Assert;
11
use Symfony\Component\Validator\Context\ExecutionContextInterface;
12
use Symfony\Component\Yaml\Yaml;
13
use Vich\UploaderBundle\Mapping\Annotation as Vich;
14
15
trait MediaTrait
16
{
17
    use TimestampableTrait;
18
19
    /**
20
     * @ORM\Column(type="string", length=50)
21
     */
22
    protected $mimeType;
23
24
    /**
25
     * @ORM\Column(type="string", length=255)
26
     */
27
    protected $relativeDir;
28
29
    /**
30
     * @ORM\Column(type="integer")
31
     */
32
    protected $size;
33
34
    /**
35
     * @ORM\Column(type="integer", nullable=true)
36
     */
37
    protected $height;
38
39
    /**
40
     * @ORM\Column(type="integer", nullable=true)
41
     */
42
    protected $width;
43
44
    /**
45
     * @ORM\Column(type="string", nullable=true)
46
     */
47
    protected $mainColor;
48
49
    /**
50
     * @ORM\Column(type="string", length=255)
51
     */
52
    protected $media;
53
54
    /**
55
     * NOTE : this is used only for media renaming.
56
     *
57
     * @var string
58
     */
59
    protected $mediaBeforeUpdate;
60
61
    /**
62
     * NOTE: This is not a mapped field of entity metadata, just a simple property.
63
     *
64
     * @Vich\UploadableField(
65
     *     mapping="media_media",
66
     *     fileNameProperty="slug",
67
     *     mimeType="mimeType",
68
     *     size="size",
69
     *     dimensions="dimensions"
70
     * )
71
     *
72
     * @var File
73
     */
74
    protected $mediaFile;
75
76
    /**
77
     * @ORM\Column(type="string", length=100, unique=true)
78
     */
79
    protected $name;
80
81
    /**
82
     * @ORM\Column(type="text", nullable=true)
83
     */
84
    protected $names;
85
86
    protected $slug;
87
88
    /**
89
     * @ORM\OneToMany(
90
     *     targetEntity="PiedWeb\CMSBundle\Entity\PageHasMediaInterface",
91
     *     mappedBy="media",
92
     *     cascade={"all"},
93
     *     orphanRemoval=true
94
     * )
95
     */
96
    protected $pageHasMedias;
97
98
    /**
99
     * @ORM\OneToMany(
100
     *     targetEntity="PiedWeb\CMSBundle\Entity\PageInterface",
101
     *     mappedBy="mainImage"
102
     * )
103
     */
104
    protected $mainImagePages;
105
106
    public function __toString()
107
    {
108
        return $this->name.' ';
109
    }
110
111
    protected function getExtension($string)
112
    {
113
        return preg_replace('/.*(\\.[^.\\s]{3,4})$/', '$1', $string);
114
    }
115
116
    protected function slugifyPreservingExtension($string)
117
    {
118
        $extension = $this->getExtension($string);
119
        $stringSlugify = (new Slugify())->slugify($this->removeExtension($string));
120
121
        return $stringSlugify.$extension;
122
    }
123
124
    public function getSlugForce()
125
    {
126
        return $this->slug;
127
    }
128
129
    /**
130
     * Used by MediaAdmin.
131
     */
132
    public function setSlugForce($slug)
133
    {
134
        if (! $slug) {
135
            return $this;
136
        }
137
138
        $this->slug = (new Slugify(['regexp' => '/([^A-Za-z0-9\.]|-)+/']))->slugify($slug);
139
140
        if ($this->media) {
141
            $this->setMedia($this->slug.$this->getExtension($this->media));
142
        }
143
144
        return $this;
145
    }
146
147
    /**
148
     * Useed in twig AppExtension transformInlineImageToMedia.
149
     */
150
    public static function loadFromSrc($src)
151
    {
152
        $src = substr($src, \strlen('/media/default/'));
153
154
        $media = new self();
155
        $media->setRelativeDir('/media');
156
        $media->setMedia($src);
157 3
        $media->slug = $media->removeExtension($src);
158
159 3
        return $media;
160
    }
161 3
162
    /**
163 3
     * Used by VichUploader.
164
     */
165
    public function setSlug($slug)
166 3
    {
167
        if (! $slug) {
168 3
            return $this;
169
        }
170
171
        $slugSlugify = $this->slugifyPreservingExtension($slug);
172
173
        if ($this->getExtension($this->media) != $this->getExtension($slugSlugify)) { // 1;
174
            // TODO manage problem URL move... quick validation impossible before file upload, and impossible after from
175
            // here
176
177
            //$this->media ? $this->removeExtension($slugSlugify).$this->getExtension($this->media) :
178
            $this->setMedia($slugSlugify);
179
        }
180
181
        return $this;
182
    }
183
184
    /**
185 3
     * @Assert\Callback
186
     */
187 3
    public function validate(ExecutionContextInterface $context, $payload)
0 ignored issues
show
Unused Code introduced by
The parameter $payload is not used and could be removed. ( Ignorable by Annotation )

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

187
    public function validate(ExecutionContextInterface $context, /** @scrutinizer ignore-unused */ $payload)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
188
    {
189 3
        if ($this->getMimeType() && $this->mediaFile && $this->mediaFile->getMimeType() != $this->getMimeType()) {
190
            $context
191
                ->buildViolation('Attention ! Vous essayez de remplacer un fichier d\'un type ('
192
                    .$this->getMimeType().') par un fichier d\'une autre type ('.$this->mediaFile->getMimeType().')')
193
                ->atPath('fileName')
194
                ->addViolation()
195
            ;
196
        }
197
    }
198
199
    protected function removeExtension($string)
200
    {
201
        return preg_replace('/\\.[^.\\s]{3,4}$/', '', $string);
202
    }
203
204
    public function getSlug(): string
205
    {
206
        if ($this->slug) {
207
            return $this->slug;
208
        }
209
210
        if ($this->media) {
211
            return $this->slug = $this->removeExtension($this->media);
212
        }
213
214
        $this->slug = (new Slugify())->slugify($this->getName()); //Urlizer::urlize($this->getName());
215
216
        return $this->slug;
217
    }
218
219
    public function setMediaFile(?File $media = null): void
220
    {
221
        $this->mediaFile = $media;
222
223
        if (null !== $media) {
224
            $this->updatedAt = new \DateTimeImmutable();
225
        }
226
    }
227
228
    public function getMediaFile(): ?File
229
    {
230
        return $this->mediaFile;
231
    }
232
233
    public function getMedia(): ?string
234
    {
235
        return $this->media;
236
    }
237
238
    public function setMedia($media): self
239
    {
240
        if (! $media) {
241
            return $this;
242
        }
243
244
        if (null !== $this->media) {
245
            $this->setMediaBeforeUpdate($this->media);
246
            //$this->media = $this->removeExtension($media).$this->getExtension($this->media);
247
        } //else
248
249
        $this->media = $media;
250
251
        return $this;
252
    }
253
254
    public function getName($getLocalized = null, $onlyLocalized = false): ?string
255
    {
256
        $names = $this->getNames(true);
257
258
        return $getLocalized ?
259
            (isset($names[$getLocalized]) ? $names[$getLocalized] : ($onlyLocalized ? null : $this->name))
260
            : $this->name;
261
    }
262
263
    public function getNames($yaml = false)
264
    {
265
        return true === $yaml && null !== $this->names ? Yaml::parse($this->names) : $this->names;
266
    }
267
268
    public function setNames(?string $names): self
269
    {
270
        $this->name = $names;
271
272
        return $this;
273
    }
274
275
    public function getNameByLocale($locale)
276
    {
277
        $names = $this->getNames(true);
278
279
        return $names[$locale] ?? $this->getName();
280
    }
281
282
    public function setName(?string $name): self
283
    {
284
        $this->name = $name;
285
286
        return $this;
287
    }
288
289
    public function getRelativeDir(): ?string
290
    {
291
        return rtrim($this->relativeDir, '/');
292
    }
293
294
    public function setRelativeDir($relativeDir): self
295
    {
296
        $this->relativeDir = rtrim($relativeDir, '/');
297
298
        return $this;
299
    }
300
301
    public function getMimeType(): ?string
302
    {
303
        return $this->mimeType;
304
    }
305
306
    protected function getPreviousMimeType()
307
    {
308
        return $this->previousMimeType ?? null;
309
    }
310
311
    public function setMimeType($mimeType): self
312
    {
313
        $this->mimeType = $mimeType;
314
315
        return $this;
316
    }
317
318
    public function getSize()
319
    {
320
        return $this->size;
321
    }
322
323
    public function setSize($size): self
324
    {
325
        $this->size = $size;
326
327
        return $this;
328
    }
329
330
    public function setDimensions($dimensions): self
331
    {
332
        if (isset($dimensions[0])) {
333
            $this->width = (int) $dimensions[0];
334
        }
335
336
        if (isset($dimensions[1])) {
337
            $this->height = (int) $dimensions[1];
338
        }
339
340
        return $this;
341
    }
342
343
    public function getDimensions(): array
344
    {
345
        return [$this->width, $this->height];
346
    }
347
348
    public function getRatio(): float
349
    {
350
        return $this->height / $this->width;
351
    }
352
353
    public function getWidth()
354
    {
355
        return $this->width;
356
    }
357
358
    public function getHeight()
359
    {
360
        return $this->height;
361
    }
362
363
    public function getMainColor(): ?string
364
    {
365
        return $this->mainColor;
366
    }
367
368
    public function getMainColorOpposite()
369
    {
370
        if (null === $this->getMainColor()) {
371
            return;
372
        }
373
374
        return Color::fromHex($this->getMainColor())->invert(true);
375
    }
376
377
    public function setMainColor(?string $mainColor): self
378
    {
379
        $this->mainColor = $mainColor;
380
381
        return $this;
382
    }
383
384
    public function setPageHasMedias($pageHasMedias)
385
    {
386
        $this->pageHasMedias = new ArrayCollection();
387
        foreach ($pageHasMedias as $pageHasMedia) {
388
            $this->addPageHasMedia($pageHasMedia);
389
        }
390
    }
391
392
    public function getPageHasMedias()
393
    {
394
        return $this->pageHasMedias;
395
    }
396
397
    public function addPageHasMedia(PageHasMedia $pageHasMedia)
398
    {
399
        $pageHasMedia->setMedia($this);
400
        $this->pageHasMedias[] = $pageHasMedia;
401
    }
402
403
    public function removePageHasMedia(PageHasMedia $pageHasMedia)
404
    {
405
        $this->pageHasMedias->removeElement($pageHasMedia);
406
    }
407
408
    public function getMainImagePages()
409
    {
410
        return $this->mainImagePages;
411
    }
412
413
    /**
414
     * @ORM\PreRemove
415
     */
416
    public function removeMainImageFromPages()
417
    {
418
        foreach ($this->mainImagePages as $page) {
419
            $page->setMainImage(null);
420
        }
421
    }
422
423
    public function getPath(): ?string
424
    {
425
        return $this->getFullPath();
426
    }
427
428
    public function getFullPath(): ?string
429
    {
430
        return null !== $this->media
431
            ? '/'.$this->getRelativeDir().($this->getMedia() ? '/'.$this->getMedia() : '')
432
            : null;
433
    }
434
435
    public function getFullPathWebP(): ?string
436
    {
437
        return null !== $this->media
438
            ? '/'.$this->getRelativeDir().($this->getSlug() ? '/'.$this->getSlug().'.webp' : '')
439
            : null;
440
    }
441
442
    /**
443
     * Get nOTE : this is used only for media renaming.
444
     *
445
     * @return string
446
     */
447
    public function getMediaBeforeUpdate()
448
    {
449
        return $this->mediaBeforeUpdate;
450
    }
451
452
    /**
453
     * Set nOTE : this is used only for media renaming.
454
     *
455
     * @param string $mediaBeforeUpdate NOTE : this is used only for media renaming
456
     *
457
     * @return self
458
     */
459
    public function setMediaBeforeUpdate(string $mediaBeforeUpdate)
460
    {
461
        $this->mediaBeforeUpdate = $mediaBeforeUpdate;
462
463
        return $this;
464
    }
465
}
466