PageImporter::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 11
dl 0
loc 25
rs 9.9
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/*
4
 * This file was created by developers working at BitBag
5
 * Do you need more information about us and what we do? Visit our https://bitbag.io website!
6
 * We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
7
*/
8
9
declare(strict_types=1);
10
11
namespace BitBag\SyliusCmsPlugin\Importer;
12
13
use BitBag\SyliusCmsPlugin\Downloader\ImageDownloaderInterface;
14
use BitBag\SyliusCmsPlugin\Entity\MediaInterface;
15
use BitBag\SyliusCmsPlugin\Entity\PageInterface;
16
use BitBag\SyliusCmsPlugin\Entity\PageTranslationInterface;
17
use BitBag\SyliusCmsPlugin\Resolver\ImporterChannelsResolverInterface;
18
use BitBag\SyliusCmsPlugin\Resolver\ImporterProductsResolverInterface;
19
use BitBag\SyliusCmsPlugin\Resolver\ImporterSectionsResolverInterface;
20
use BitBag\SyliusCmsPlugin\Resolver\MediaProviderResolverInterface;
21
use BitBag\SyliusCmsPlugin\Resolver\ResourceResolverInterface;
22
use Doctrine\ORM\EntityManagerInterface;
23
use Sylius\Component\Locale\Context\LocaleContextInterface;
24
use Sylius\Component\Resource\Factory\FactoryInterface;
25
use Symfony\Component\HttpFoundation\File\File;
26
use Symfony\Component\Validator\Validator\ValidatorInterface;
27
use Webmozart\Assert\Assert;
28
29
final class PageImporter extends AbstractImporter implements PageImporterInterface
30
{
31
    /** @var ResourceResolverInterface */
32
    private $pageResourceResolver;
33
34
    /** @var ResourceResolverInterface */
35
    private $sectionResolver;
36
37
    /** @var LocaleContextInterface */
38
    private $localeContext;
39
40
    /** @var ImageDownloaderInterface */
41
    private $imageDownloader;
42
43
    /** @var FactoryInterface */
44
    private $mediaFactory;
45
46
    /** @var MediaProviderResolverInterface */
47
    private $mediaProviderResolver;
48
49
    /** @var ImporterSectionsResolverInterface */
50
    private $importerSectionsResolver;
51
52
    /** @var ImporterChannelsResolverInterface */
53
    private $importerChannelsResolver;
54
55
    /** @var ImporterProductsResolverInterface */
56
    private $importerProductsResolver;
57
58
    /** @var EntityManagerInterface */
59
    private $entityManager;
60
61
    public function __construct(
62
        ResourceResolverInterface $pageResourceResolver,
63
        ResourceResolverInterface $sectionResolver,
64
        LocaleContextInterface $localeContext,
65
        ImageDownloaderInterface $imageDownloader,
66
        FactoryInterface $mediaFactory,
67
        MediaProviderResolverInterface $mediaProviderResolver,
68
        ImporterSectionsResolverInterface $importerSectionsResolver,
69
        ImporterChannelsResolverInterface $importerChannelsResolver,
70
        ImporterProductsResolverInterface $importerProductsResolver,
71
        ValidatorInterface $validator,
72
        EntityManagerInterface $entityManager
73
    ) {
74
        parent::__construct($validator);
75
76
        $this->pageResourceResolver = $pageResourceResolver;
77
        $this->sectionResolver = $sectionResolver;
78
        $this->localeContext = $localeContext;
79
        $this->imageDownloader = $imageDownloader;
80
        $this->mediaFactory = $mediaFactory;
81
        $this->mediaProviderResolver = $mediaProviderResolver;
82
        $this->importerSectionsResolver = $importerSectionsResolver;
83
        $this->importerChannelsResolver = $importerChannelsResolver;
84
        $this->importerProductsResolver = $importerProductsResolver;
85
        $this->entityManager = $entityManager;
86
    }
87
88
    public function import(array $row): void
89
    {
90
        /** @var string|null $code */
91
        $code = $this->getColumnValue(self::CODE_COLUMN, $row);
92
        Assert::notNull($code);
93
94
        /** @var PageInterface $page */
95
        $page = $this->pageResourceResolver->getResource($code);
0 ignored issues
show
Bug introduced by
It seems like $code can also be of type null; however, parameter $identifier of BitBag\SyliusCmsPlugin\R...nterface::getResource() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

95
        $page = $this->pageResourceResolver->getResource(/** @scrutinizer ignore-type */ $code);
Loading history...
96
97
        $page->setCode($code);
98
        $page->setFallbackLocale($this->localeContext->getLocaleCode());
99
100
        foreach ($this->getAvailableLocales($this->getTranslatableColumns(), array_keys($row)) as $locale) {
101
            $page->setCurrentLocale($locale);
102
            $page->setSlug($this->getTranslatableColumnValue(self::SLUG_COLUMN, $locale, $row));
103
            $page->setName($this->getTranslatableColumnValue(self::NAME_COLUMN, $locale, $row));
104
            $page->setMetaKeywords($this->getTranslatableColumnValue(self::META_KEYWORDS_COLUMN, $locale, $row));
105
            $page->setMetaDescription($this->getTranslatableColumnValue(self::META_DESCRIPTION_COLUMN, $locale, $row));
106
            $page->setContent($this->getTranslatableColumnValue(self::CONTENT_COLUMN, $locale, $row));
107
            $page->setBreadcrumb($this->getTranslatableColumnValue(self::BREADCRUMB_COLUMN, $locale, $row));
108
            $page->setNameWhenLinked($this->getTranslatableColumnValue(self::NAME_WHEN_LINKED_COLUMN, $locale, $row));
109
            $page->setDescriptionWhenLinked($this->getTranslatableColumnValue(self::DESCRIPTION_WHEN_LINKED_COLUMN, $locale, $row));
110
111
            $url = $this->getTranslatableColumnValue(self::IMAGE_COLUMN, $locale, $row);
112
            $imageCode = $this->getTranslatableColumnValue(self::IMAGE_CODE_COLUMN, $locale, $row);
113
114
            if (null !== $url) {
115
                $this->resolveImage($page, $url ?? '', $locale, $imageCode);
0 ignored issues
show
Bug introduced by
It seems like $imageCode can also be of type null; however, parameter $imageCode of BitBag\SyliusCmsPlugin\I...mporter::resolveImage() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

115
                $this->resolveImage($page, $url ?? '', $locale, /** @scrutinizer ignore-type */ $imageCode);
Loading history...
116
            }
117
        }
118
119
        $this->importerSectionsResolver->resolve($page, $this->getColumnValue(self::SECTIONS_COLUMN, $row));
120
        $this->importerChannelsResolver->resolve($page, $this->getColumnValue(self::CHANNELS_COLUMN, $row));
121
        $this->importerProductsResolver->resolve($page, $this->getColumnValue(self::PRODUCTS_COLUMN, $row));
122
123
        $this->validateResource($page, ['bitbag']);
124
125
        $this->entityManager->persist($page);
126
        $this->entityManager->flush();
127
    }
128
129
    public function getResourceCode(): string
130
    {
131
        return 'page';
132
    }
133
134
    private function resolveImage(
135
        PageInterface $page,
136
        string $url,
137
        string $locale,
138
        string $imageCode
139
    ): void {
140
        $downloadedImage = $this->imageDownloader->download($url);
141
142
        /** @var MediaInterface $image */
143
        $image = $this->mediaFactory->createNew();
144
        $image->setFile($downloadedImage);
145
        $image->setType($this->getFileType($downloadedImage));
146
        $image->setCode($imageCode);
147
148
        /** @var PageTranslationInterface $pageTranslation */
149
        $pageTranslation = $page->getTranslation($locale);
150
        $pageTranslation->setImage($image);
151
152
        $this->mediaProviderResolver->resolveProvider($image)->upload($image);
153
        $this->entityManager->persist($image);
154
    }
155
156
    private function getFileType(File $file): string
157
    {
158
        switch ($file->getExtension()) {
159
            case 'png':
160
            case 'jpg':
161
            case 'jpeg':
162
            case 'gif':
163
                return MediaInterface::IMAGE_TYPE;
164
            case 'mp4':
165
                return MediaInterface::VIDEO_TYPE;
166
        }
167
168
        return MediaInterface::FILE_TYPE;
169
    }
170
171
    private function getTranslatableColumns(): array
172
    {
173
        return [
174
            self::SLUG_COLUMN,
175
            self::NAME_COLUMN,
176
            self::IMAGE_COLUMN,
177
            self::IMAGE_CODE_COLUMN,
178
            self::META_KEYWORDS_COLUMN,
179
            self::META_DESCRIPTION_COLUMN,
180
            self::CONTENT_COLUMN,
181
            self::BREADCRUMB_COLUMN,
182
            self::NAME_WHEN_LINKED_COLUMN,
183
            self::DESCRIPTION_WHEN_LINKED_COLUMN,
184
        ];
185
    }
186
}
187