Completed
Pull Request — master (#71)
by
unknown
02:34
created

SonataSeoExtension::configureClassesToCompile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 9
rs 9.6666
cc 1
eloc 6
nc 1
nop 0
1
<?php
2
3
namespace Sonata\SeoBundle\DependencyInjection;
4
5
use Symfony\Component\Config\FileLocator;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\ContainerInterface;
8
use Symfony\Component\DependencyInjection\Definition;
9
use Symfony\Component\DependencyInjection\Loader;
10
use Symfony\Component\DependencyInjection\Reference;
11
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
12
13
/**
14
 * This is the class that loads and manages your bundle configuration.
15
 */
16
class SonataSeoExtension extends Extension
17
{
18
    /**
19
     * {@inheritdoc}
20
     */
21
    public function load(array $configs, ContainerBuilder $container)
22
    {
23
        $configuration = new Configuration();
24
        $config = $this->processConfiguration($configuration, $configs);
25
        $config = $this->fixConfiguration($config);
26
27
        $bundles = $container->getParameter('kernel.bundles');
28
29
        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
30
31
        if (isset($bundles['SonataBlockBundle']) && isset($bundles['KnpMenuBundle'])) {
32
            $loader->load('blocks.xml');
33
        }
34
35
        $loader->load('event.xml');
36
        $loader->load('services.xml');
37
38
        $this->configureSeoPage($config['page'], $container);
39
        $this->configureSitemap($config['sitemap'], $container);
40
        $this->configureClassesToCompile();
41
42
        $container->getDefinition('sonata.seo.twig.extension')
43
            ->replaceArgument(1, $config['encoding']);
44
    }
45
46
    /**
47
     * Configure the default seo page.
48
     *
49
     * @param array            $config
50
     * @param ContainerBuilder $container
51
     */
52
    protected function configureSeoPage(array $config, ContainerBuilder $container)
53
    {
54
        $definition = $container->getDefinition($config['default']);
55
56
        if (count($config['head']) {
57
            trigger_error('sonata_seo->page->head config is deprecated. Use sonata_seo->page->html_tag instead.', E_USER_DEPRECATED);
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected ';'
Loading history...
58
            $config['html_tag'] = array_merge($config['head'], $config['html_tag']);
59
        }
60
        $definition->addMethodCall('setTitle', array($config['title']));
61
        $definition->addMethodCall('setMetas', array($config['metas']));
62
        $definition->addMethodCall('setHtmlAttributes', array($config['html_tag']));
63
        $definition->addMethodCall('setHeadAttributes', array($config['head_tag']));
64
        $definition->addMethodCall('setSeparator', array($config['separator']));
65
66
        $container->setAlias('sonata.seo.page', $config['default']);
67
    }
68
69
    /**
70
     * Configure the sitemap source manager.
71
     *
72
     * @param array            $config
73
     * @param ContainerBuilder $container
74
     */
75
    protected function configureSitemap(array $config, ContainerBuilder $container)
76
    {
77
        $source = $container->getDefinition('sonata.seo.sitemap.manager');
78
79
        if (method_exists($source, 'setShared')) { // Symfony 2.8+
80
            $source->setShared(false);
81
        } else {
82
            // For Symfony <2.8 compatibility
83
            $source->setScope(ContainerInterface::SCOPE_PROTOTYPE);
84
        }
85
86
        foreach ($config['doctrine_orm'] as $pos => $sitemap) {
87
            // define the connectionIterator
88
            $connectionIteratorId = 'sonata.seo.source.doctrine_connection_iterator_'.$pos;
89
90
            $connectionIterator = new Definition('%sonata.seo.exporter.database_source_iterator.class%', array(
91
                new Reference($sitemap['connection']),
92
                $sitemap['query'],
93
            ));
94
95
            $connectionIterator->setPublic(false);
96
            $container->setDefinition($connectionIteratorId, $connectionIterator);
97
98
            // define the sitemap proxy iterator
99
            $sitemapIteratorId = 'sonata.seo.source.doctrine_sitemap_iterator_'.$pos;
100
101
            $sitemapIterator = new Definition('%sonata.seo.exporter.sitemap_source_iterator.class%', array(
102
                new Reference($connectionIteratorId),
103
                new Reference('router'),
104
                $sitemap['route'],
105
                $sitemap['parameters'],
106
            ));
107
108
            $sitemapIterator->setPublic(false);
109
110
            $container->setDefinition($sitemapIteratorId, $sitemapIterator);
111
112
            $source->addMethodCall('addSource', array($sitemap['group'], new Reference($sitemapIteratorId), $sitemap['types']));
113
        }
114
115
        foreach ($config['services'] as $service) {
116
            $source->addMethodCall('addSource', array($service['group'], new Reference($service['id']), $service['types']));
117
        }
118
    }
119
120
    /**
121
     * Fix the sitemap configuration.
122
     *
123
     * @param array $config
124
     *
125
     * @return array
126
     */
127
    protected function fixConfiguration(array $config)
128
    {
129
        foreach ($config['sitemap']['doctrine_orm'] as $pos => $sitemap) {
130
            $sitemap['group']      = isset($sitemap['group']) ? $sitemap['group'] : false;
131
            $sitemap['types']      = isset($sitemap['types']) ? $sitemap['types'] : array();
132
            $sitemap['connection'] = isset($sitemap['connection']) ? $sitemap['connection'] : 'doctrine.dbal.default_connection';
133
            $sitemap['route']      = isset($sitemap['route']) ? $sitemap['route'] : false;
134
            $sitemap['parameters'] = isset($sitemap['parameters']) ? $sitemap['parameters'] : false;
135
            $sitemap['query']      = isset($sitemap['query']) ? $sitemap['query'] : false;
136
137
            if ($sitemap['route'] === false) {
138
                throw new \RuntimeException('Route cannot be empty, please review the sonata_seo.sitemap configuration');
139
            }
140
141
            if ($sitemap['query'] === false) {
142
                throw new \RuntimeException('Query cannot be empty, please review the sonata_seo.sitemap configuration');
143
            }
144
145
            if ($sitemap['parameters'] === false) {
146
                throw new \RuntimeException('Route\'s parameters cannot be empty, please review the sonata_seo.sitemap configuration');
147
            }
148
149
            $config['sitemap']['doctrine_orm'][$pos] = $sitemap;
150
        }
151
152
        foreach ($config['sitemap']['services'] as $pos => $sitemap) {
153
            if (!is_array($sitemap)) {
154
                $sitemap = array(
155
                    'group' => false,
156
                    'types' => array(),
157
                    'id'    => $sitemap,
158
                );
159
            } else {
160
                $sitemap['group'] = isset($sitemap['group']) ? $sitemap['group'] : false;
161
                $sitemap['types'] = isset($sitemap['types']) ? $sitemap['types'] : array();
162
163
                if (!isset($sitemap['id'])) {
164
                    throw new \RuntimeException('Service id must to be defined, please review the sonata_seo.sitemap configuration');
165
                }
166
            }
167
168
            $config['sitemap']['services'][$pos] = $sitemap;
169
        }
170
171
        return $config;
172
    }
173
174
    /**
175
     * Add class to compile.
176
     */
177
    public function configureClassesToCompile()
178
    {
179
        $this->addClassesToCompile(array(
180
            'Sonata\\SeoBundle\\Seo\\SeoPage',
181
            'Sonata\\SeoBundle\\Seo\\SeoPageInterface',
182
            'Sonata\\SeoBundle\\Sitemap\\SourceManager',
183
            'Sonata\\SeoBundle\\Twig\\Extension\\SeoExtension',
184
        ));
185
    }
186
}
187