Completed
Pull Request — develop (#195)
by Wachter
12:57
created

SuluArticleExtension   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 177
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 98.04%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 5
dl 0
loc 177
ccs 50
cts 51
cp 0.9804
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
C prepend() 0 94 7
B load() 0 39 3
A appendArticlePageConfig() 0 10 1
A cloneArticleConfig() 0 9 2
1
<?php
2
3
/*
4
 * This file is part of Sulu.
5
 *
6
 * (c) MASSIVE ART WebServices GmbH
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace Sulu\Bundle\ArticleBundle\DependencyInjection;
13
14
use Sulu\Bundle\ArticleBundle\Document\ArticleDocument;
15
use Sulu\Bundle\ArticleBundle\Document\ArticlePageDocument;
16
use Sulu\Bundle\ArticleBundle\Document\Structure\ArticleBridge;
17
use Sulu\Bundle\ArticleBundle\Document\Structure\ArticlePageBridge;
18
use Sulu\Bundle\ArticleBundle\Exception\ArticlePageNotFoundException;
19
use Sulu\Bundle\ArticleBundle\Exception\ParameterNotAllowedException;
20
use Symfony\Component\Config\FileLocator;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
23
use Symfony\Component\DependencyInjection\Loader;
24
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
25
26
/**
27
 * This is the class that loads and manages article bundle configuration.
28
 */
29
class SuluArticleExtension extends Extension implements PrependExtensionInterface
30
{
31
    /**
32
     * {@inheritdoc}
33
     */
34 1
    public function prepend(ContainerBuilder $container)
35
    {
36 1
        if ($container->hasExtension('sulu_core')) {
37 1
            $container->prependExtensionConfig(
38 1
                'sulu_core',
39
                [
40 1
                    'content' => [
41
                        'structure' => [
42
                            'type_map' => [
43
                                'article' => ArticleBridge::class,
44
                                'article_page' => ArticlePageBridge::class,
45
                            ],
46
                        ],
47
                    ],
48
                ]
49
            );
50
        }
51
52 1
        if ($container->hasExtension('jms_serializer')) {
53 1
            $container->prependExtensionConfig(
54 1
                'jms_serializer',
55
                [
56 1
                    'metadata' => [
57
                        'directories' => [
58
                            [
59
                                'path' => __DIR__ . '/../Resources/config/serializer',
60
                                'namespace_prefix' => 'Sulu\Bundle\ArticleBundle',
61
                            ],
62
                        ],
63
                    ],
64
                ]
65
            );
66
        }
67
68 1
        if ($container->hasExtension('sulu_search')) {
69 1
            $container->prependExtensionConfig(
70 1
                'sulu_content',
71
                [
72 1
                    'search' => [
73
                        'mapping' => [
74
                            ArticleDocument::class => ['index' => 'article'],
75
                            ArticlePageDocument::class => ['index' => 'article_page'],
76
                        ],
77
                    ],
78
                ]
79
            );
80
        }
81
82 1
        if ($container->hasExtension('sulu_document_manager')) {
83 1
            $container->prependExtensionConfig(
84 1
                'sulu_document_manager',
85
                [
86 1
                    'mapping' => [
87
                        'article' => ['class' => ArticleDocument::class, 'phpcr_type' => 'sulu:article'],
88
                        'article_page' => ['class' => ArticlePageDocument::class, 'phpcr_type' => 'sulu:articlepage'],
89
                    ],
90
                    'path_segments' => [
91
                        'articles' => 'articles',
92
                    ],
93
                ]
94
            );
95
        }
96
97 1
        if ($container->hasExtension('sulu_route')) {
98 1
            $container->prependExtensionConfig(
99 1
                'sulu_route',
100
                [
101 1
                    'mappings' => [
102
                        ArticlePageDocument::class => [
103
                            'generator' => 'article_page',
104
                            'options' => [
105
                                'route_schema' => '/{translator.trans("page")}-{object.getPageNumber()}',
106
                                'parent' => '{object.getParent().getRoutePath()}',
107
                            ],
108
                        ],
109
                    ],
110
                ]
111
            );
112
        }
113
114 1
        if ($container->hasExtension('fos_rest')) {
115 1
            $container->prependExtensionConfig(
116 1
                'fos_rest',
117
                [
118 1
                    'exception' => [
119
                        'codes' => [
120
                            ParameterNotAllowedException::class => 400,
121
                            ArticlePageNotFoundException::class => 404,
122
                        ],
123
                    ],
124
                ]
125
            );
126
        }
127 1
    }
128
129
    /**
130
     * {@inheritdoc}
131
     */
132 1
    public function load(array $configs, ContainerBuilder $container)
133
    {
134 1
        $configuration = new Configuration();
135 1
        $config = $this->processConfiguration($configuration, $configs);
136 1
        $container->setParameter('sulu_article.types', $config['types']);
137 1
        $container->setParameter('sulu_article.documents', $config['documents']);
138 1
        $container->setParameter('sulu_article.view_document.article.class', $config['documents']['article']['view']);
139 1
        $container->setParameter('sulu_article.display_tab_all', $config['display_tab_all']);
140 1
        $container->setParameter('sulu_article.smart_content.default_limit', $config['smart_content']['default_limit']);
141
142 1
        $container->setParameter(
143 1
            'sulu_article.content-type.article.template',
144 1
            $config['content_types']['article']['template']
145
        );
146
147 1
        $container->setParameter(
148 1
            'sulu_article.content-type.page_tree_route.template',
149 1
            $config['content_types']['page_tree_route']['template']
150
        );
151
152 1
        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
153 1
        $loader->load('services.xml');
154
155 1
        $bundles = $container->getParameter('kernel.bundles');
156 1
        if (array_key_exists('SuluAutomationBundle', $bundles)) {
157
            $loader->load('automation.xml');
158
        }
159
160 1
        $container->setAlias(
161 1
            'sulu_article.page_tree_route.updater',
162 1
            'sulu_article.page_tree_route.updater.' . $config['content_types']['page_tree_route']['page_route_cascade']
163
        );
164
165 1
        if ($config['content_types']['page_tree_route']['page_route_cascade'] !== 'off') {
166 1
            $loader->load('page_tree_update.xml');
167
        }
168 1
169
        $this->appendArticlePageConfig($container);
170
    }
171
172
    /**
173
     * Append configuration for article-page (cloned from article).
174
     *
175
     * @param ContainerBuilder $container
176
     */
177
    private function appendArticlePageConfig(ContainerBuilder $container)
178
    {
179
        $paths = $container->getParameter('sulu.content.structure.paths');
180
        $paths['article_page'] = $this->cloneArticleConfig($paths['article'], 'article_page');
181
        $container->setParameter('sulu.content.structure.paths', $paths);
182
183
        $defaultTypes = $container->getParameter('sulu.content.structure.default_types');
184
        $defaultTypes['article_page'] = $defaultTypes['article'];
185
        $container->setParameter('sulu.content.structure.default_types', $defaultTypes);
186
    }
187
188
    /**
189
     * Clone given path configuration and use given type.
190
     *
191
     * @param array $config
192
     * @param string $type
193
     *
194
     * @return array
195
     */
196
    private function cloneArticleConfig(array $config, $type)
197
    {
198
        $result = [];
199
        foreach ($config as $item) {
200
            $result[] = ['path' => $item['path'], 'type' => $type];
201
        }
202
203
        return $result;
204
    }
205
}
206