Skip to content

Commit 9d5aba7

Browse files
committed
Merge pull request #312 from symfony-cmf/simplify_extension
Clean up DI Extension & Configuration classes
2 parents 8a88cf6 + f040644 commit 9d5aba7

File tree

5 files changed

+147
-169
lines changed

5 files changed

+147
-169
lines changed

DependencyInjection/CmfRoutingExtension.php

Lines changed: 100 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
/**
2323
* @author Philippo de Santis
2424
* @author David Buchmann
25+
* @author Wouter de Jong <[email protected]>
2526
*/
2627
class CmfRoutingExtension extends Extension
2728
{
@@ -33,32 +34,35 @@ public function load(array $configs, ContainerBuilder $container)
3334
$config = $this->processConfiguration(new Configuration(), $configs);
3435
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
3536

36-
if ($config['dynamic']['enabled']) {
37-
// load this even if no explicit enabled value but some configuration
37+
if ($this->isConfigEnabled($container, $config['dynamic'])) {
3838
$this->setupDynamicRouter($config['dynamic'], $container, $loader);
3939
}
4040

41-
/* set up the chain router */
41+
$this->setupChainRouter($config, $container, $loader);
42+
$this->setupFormTypes($config, $container, $loader);
43+
44+
$loader->load('validators.xml');
45+
}
46+
47+
private function setupChainRouter(array $config, ContainerBuilder $container, LoaderInterface $loader)
48+
{
4249
$loader->load('routing-chain.xml');
43-
$container->setParameter($this->getAlias() . '.replace_symfony_router', $config['chain']['replace_symfony_router']);
50+
51+
$container->setParameter('cmf_routing.replace_symfony_router', $config['chain']['replace_symfony_router']);
4452

4553
// add the routers defined in the configuration mapping
46-
$router = $container->getDefinition($this->getAlias() . '.router');
54+
$router = $container->getDefinition('cmf_routing.router');
4755
foreach ($config['chain']['routers_by_id'] as $id => $priority) {
4856
$router->addMethodCall('add', array(new Reference($id), trim($priority)));
4957
}
50-
51-
$this->setupFormTypes($config, $container, $loader);
52-
53-
$loader->load('validators.xml');
5458
}
5559

56-
public function setupFormTypes(array $config, ContainerBuilder $container, LoaderInterface $loader)
60+
private function setupFormTypes(array $config, ContainerBuilder $container, LoaderInterface $loader)
5761
{
5862
$loader->load('form-type.xml');
5963

6064
if (isset($config['dynamic'])) {
61-
$routeTypeTypeDefinition = $container->getDefinition($this->getAlias() . '.route_type_form_type');
65+
$routeTypeTypeDefinition = $container->getDefinition('cmf_routing.route_type_form_type');
6266

6367
foreach (array_keys($config['dynamic']['controllers_by_type']) as $routeType) {
6468
$routeTypeTypeDefinition->addMethodCall('addRouteType', array($routeType));
@@ -75,102 +79,81 @@ public function setupFormTypes(array $config, ContainerBuilder $container, Loade
7579
*/
7680
private function setupDynamicRouter(array $config, ContainerBuilder $container, LoaderInterface $loader)
7781
{
82+
$loader->load('routing-dynamic.xml');
83+
7884
// strip whitespace (XML support)
7985
foreach (array('controllers_by_type', 'controllers_by_class', 'templates_by_class', 'route_filters_by_id') as $option) {
80-
$config[$option] = array_map(function ($value) {
81-
return trim($value);
82-
}, $config[$option]);
86+
$config[$option] = array_map('trim', $config[$option]);
8387
}
8488

8589
$defaultController = $config['default_controller'];
8690
if (null === $defaultController) {
8791
$defaultController = $config['generic_controller'];
8892
}
89-
$container->setParameter($this->getAlias() . '.default_controller', $defaultController);
90-
$container->setParameter($this->getAlias() . '.generic_controller', $config['generic_controller']);
91-
$container->setParameter($this->getAlias() . '.controllers_by_type', $config['controllers_by_type']);
92-
$container->setParameter($this->getAlias() . '.controllers_by_class', $config['controllers_by_class']);
93-
$container->setParameter($this->getAlias() . '.templates_by_class', $config['templates_by_class']);
94-
$container->setParameter($this->getAlias() . '.uri_filter_regexp', $config['uri_filter_regexp']);
95-
$container->setParameter($this->getAlias() . '.route_collection_limit', $config['route_collection_limit']);
96-
97-
$locales = empty($config['locales']) ? array() : $config['locales'];
98-
$container->setParameter($this->getAlias() . '.dynamic.locales', $locales);
99-
if (count($locales) === 0 && $config['auto_locale_pattern']) {
93+
$container->setParameter('cmf_routing.default_controller', $defaultController);
94+
95+
$locales = $config['locales'];
96+
if (0 === count($locales) && $config['auto_locale_pattern']) {
10097
throw new InvalidConfigurationException('It makes no sense to activate auto_locale_pattern when no locales are configured.');
10198
}
102-
$container->setParameter($this->getAlias() . '.dynamic.auto_locale_pattern', $config['auto_locale_pattern']);
103-
104-
$container->setParameter($this->getAlias() . '.dynamic.limit_candidates', $config['limit_candidates']);
10599

106-
$loader->load('routing-dynamic.xml');
100+
$this->configureParameters($container, $config, array(
101+
'generic_controller' => 'generic_controller',
102+
'controllers_by_type' => 'controllers_by_type',
103+
'controllers_by_class' => 'controllers_by_class',
104+
'templates_by_class' => 'templates_by_class',
105+
'uri_filter_regexp' => 'uri_filter_regexp',
106+
'route_collection_limit' => 'route_collection_limit',
107+
'limit_candidates' => 'dynamic.limit_candidates',
108+
'locales' => 'dynamic.locales',
109+
'auto_locale_pattern' => 'dynamic.auto_locale_pattern',
110+
));
107111

108112
$hasProvider = false;
109113
$hasContentRepository = false;
110-
if ($config['persistence']['phpcr']['enabled'] && $config['persistence']['orm']['enabled']) {
111-
throw new InvalidConfigurationException('You can only enable either phpcr or orm, not both.');
112-
}
113-
114114
if ($config['persistence']['phpcr']['enabled']) {
115115
$this->loadPhpcrProvider($config['persistence']['phpcr'], $loader, $container, $locales, $config['match_implicit_locale']);
116-
$hasProvider = true;
117-
$hasContentRepository = true;
116+
$hasProvider = $hasContentRepository = true;
118117
}
119118

120119
if ($config['persistence']['orm']['enabled']) {
121120
$this->loadOrmProvider($config['persistence']['orm'], $loader, $container, $locales, $config['match_implicit_locale']);
122-
$hasProvider = true;
123-
$hasContentRepository = true;
121+
$hasProvider = $hasContentRepository = true;
124122
}
125123

126124
if (isset($config['route_provider_service_id'])) {
127-
$container->setAlias($this->getAlias() . '.route_provider', $config['route_provider_service_id']);
125+
$container->setAlias('cmf_routing.route_provider', $config['route_provider_service_id']);
128126
$hasProvider = true;
129127
}
128+
130129
if (!$hasProvider) {
131130
throw new InvalidConfigurationException('When the dynamic router is enabled, you need to either enable one of the persistence layers or set the cmf_routing.dynamic.route_provider_service_id option');
132131
}
132+
133133
if (isset($config['content_repository_service_id'])) {
134-
$container->setAlias($this->getAlias() . '.content_repository', $config['content_repository_service_id']);
134+
$container->setAlias('cmf_routing.content_repository', $config['content_repository_service_id']);
135135
$hasContentRepository = true;
136136
}
137+
137138
// content repository is optional
138139
if ($hasContentRepository) {
139-
$generator = $container->getDefinition($this->getAlias() . '.generator');
140-
$generator->addMethodCall('setContentRepository', array(
141-
new Reference($this->getAlias() . '.content_repository'),
142-
));
140+
$generator = $container->getDefinition('cmf_routing.generator');
141+
$generator->addMethodCall('setContentRepository', array(new Reference('cmf_routing.content_repository')));
143142
}
144143

145-
$dynamic = $container->getDefinition($this->getAlias() . '.dynamic_router');
144+
$dynamic = $container->getDefinition('cmf_routing.dynamic_router');
146145

147146
// if any mappings are defined, set the respective route enhancer
148-
if (!empty($config['controllers_by_type'])) {
149-
$dynamic->addMethodCall(
150-
'addRouteEnhancer',
151-
array(
152-
new Reference($this->getAlias() . '.enhancer.controllers_by_type'),
153-
60
154-
)
155-
);
147+
if (count($config['controllers_by_type']) > 0) {
148+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.controllers_by_type'), 60));
156149
}
157-
if (!empty($config['controllers_by_class'])) {
158-
$dynamic->addMethodCall(
159-
'addRouteEnhancer',
160-
array(
161-
new Reference($this->getAlias() . '.enhancer.controllers_by_class'),
162-
50
163-
)
164-
);
150+
151+
if (count($config['controllers_by_class']) > 0) {
152+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.controllers_by_class'), 50));
165153
}
166-
if (!empty($config['templates_by_class'])) {
167-
$dynamic->addMethodCall(
168-
'addRouteEnhancer',
169-
array(
170-
new Reference($this->getAlias() . '.enhancer.templates_by_class'),
171-
40
172-
)
173-
);
154+
155+
if (count($config['templates_by_class']) > 0) {
156+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.templates_by_class'), 40));
174157

175158
/*
176159
* The CoreBundle prepends the controller from ContentBundle if the
@@ -184,46 +167,29 @@ private function setupDynamicRouter(array $config, ContainerBuilder $container,
184167
throw new InvalidConfigurationException('If you want to configure templates_by_class, you need to configure the generic_controller option.');
185168
}
186169

187-
if (is_string($config['generic_controller'])) {
188-
// if the content class defines the template, we also need to make sure we use the generic controller for those routes
189-
$controllerForTemplates = array();
190-
foreach ($config['templates_by_class'] as $key => $value) {
191-
$controllerForTemplates[$key] = $config['generic_controller'];
192-
}
193-
194-
$definition = $container->getDefinition($this->getAlias() . '.enhancer.controller_for_templates_by_class');
195-
$definition->replaceArgument(2, $controllerForTemplates);
196-
197-
$dynamic->addMethodCall(
198-
'addRouteEnhancer',
199-
array(
200-
new Reference($this->getAlias() . '.enhancer.controller_for_templates_by_class'),
201-
30
202-
)
203-
);
170+
// if the content class defines the template, we also need to make sure we use the generic controller for those routes
171+
$controllerForTemplates = array();
172+
foreach ($config['templates_by_class'] as $key => $value) {
173+
$controllerForTemplates[$key] = $config['generic_controller'];
204174
}
175+
176+
$definition = $container->getDefinition('cmf_routing.enhancer.controller_for_templates_by_class');
177+
$definition->replaceArgument(2, $controllerForTemplates);
178+
179+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.controller_for_templates_by_class'), 30));
205180
}
206-
if (!empty($config['generic_controller']) && $config['generic_controller'] !== $defaultController) {
207-
$dynamic->addMethodCall(
208-
'addRouteEnhancer',
209-
array(
210-
new Reference($this->getAlias() . '.enhancer.explicit_template'),
211-
10
212-
)
213-
);
181+
182+
if (null !== $config['generic_controller'] && $defaultController !== $config['generic_controller']) {
183+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.explicit_template'), 10));
214184
}
215-
if ($defaultController) {
216-
$dynamic->addMethodCall(
217-
'addRouteEnhancer',
218-
array(
219-
new Reference($this->getAlias() . '.enhancer.default_controller'),
220-
-100
221-
)
222-
);
185+
186+
if (null !== $defaultController) {
187+
$dynamic->addMethodCall('addRouteEnhancer', array(new Reference('cmf_routing.enhancer.default_controller'), -100));
223188
}
224189

225-
if (!empty($config['route_filters_by_id'])) {
226-
$matcher = $container->getDefinition($this->getAlias() . '.nested_matcher');
190+
if (count($config['route_filters_by_id']) > 0) {
191+
$matcher = $container->getDefinition('cmf_routing.nested_matcher');
192+
227193
foreach ($config['route_filters_by_id'] as $id => $priority) {
228194
$matcher->addMethodCall('addRouteFilter', array(new Reference($id), $priority));
229195
}
@@ -232,49 +198,25 @@ private function setupDynamicRouter(array $config, ContainerBuilder $container,
232198
$dynamic->replaceArgument(2, new Reference($config['url_generator']));
233199
}
234200

235-
public function loadPhpcrProvider($config, XmlFileLoader $loader, ContainerBuilder $container, $locales, $matchImplicitLocale)
201+
private function loadPhpcrProvider($config, XmlFileLoader $loader, ContainerBuilder $container, array $locales, $matchImplicitLocale)
236202
{
237203
$loader->load('provider-phpcr.xml');
238204

239-
$container->setParameter($this->getAlias() . '.backend_type_phpcr', true);
240-
241-
$container->setParameter(
242-
$this->getAlias() . '.dynamic.persistence.phpcr.route_basepaths',
243-
array_values(array_unique($config['route_basepaths']))
244-
);
205+
$container->setParameter('cmf_routing.backend_type_phpcr', true);
206+
$container->setParameter('cmf_routing.dynamic.persistence.phpcr.route_basepaths', array_values(array_unique($config['route_basepaths'])));
245207

246208
/**
247209
* @deprecated The cmf_routing.dynamic.persistence.phpcr.route_basepath parameter is deprecated as of version 1.4 and will be removed in 2.0. Use the cmf_routing.dynamic.persistence.phpcr.route_basepaths parameter instead.
248210
*/
249-
$container->setParameter(
250-
$this->getAlias() . '.dynamic.persistence.phpcr.route_basepath',
251-
reset($config['route_basepaths'])
252-
);
253-
254-
$container->setParameter(
255-
$this->getAlias() . '.dynamic.persistence.phpcr.content_basepath',
256-
$config['content_basepath']
257-
);
258-
259-
$container->setParameter(
260-
$this->getAlias() . '.dynamic.persistence.phpcr.manager_name',
261-
$config['manager_name']
262-
);
263-
264-
$container->setAlias(
265-
$this->getAlias() . '.route_provider',
266-
$this->getAlias() . '.phpcr_route_provider'
267-
);
268-
$container->setAlias(
269-
$this->getAlias() . '.content_repository',
270-
$this->getAlias() . '.phpcr_content_repository'
271-
);
272-
273-
if (!$locales) {
274-
$container->removeDefinition($this->getAlias() . '.phpcrodm_route_locale_listener');
211+
$container->setParameter('cmf_routing.dynamic.persistence.phpcr.route_basepath', reset($config['route_basepaths']));
212+
$container->setParameter('cmf_routing.dynamic.persistence.phpcr.content_basepath', $config['content_basepath']);
213+
$container->setParameter('cmf_routing.dynamic.persistence.phpcr.manager_name', $config['manager_name']);
214+
215+
if (0 === count($locales)) {
216+
$container->removeDefinition('cmf_routing.phpcrodm_route_locale_listener');
275217
} elseif (!$matchImplicitLocale) {
276218
// remove all but the prefixes configuration from the service definition.
277-
$definition = $container->getDefinition($this->getAlias() . '.phpcr_candidates_prefix');
219+
$definition = $container->getDefinition('cmf_routing.phpcr_candidates_prefix');
278220
$definition->setArguments(array($definition->getArgument(0)));
279221
}
280222

@@ -283,38 +225,46 @@ public function loadPhpcrProvider($config, XmlFileLoader $loader, ContainerBuild
283225
}
284226
}
285227

286-
public function loadSonataPhpcrAdmin($config, XmlFileLoader $loader, ContainerBuilder $container)
228+
private function loadSonataPhpcrAdmin($config, XmlFileLoader $loader, ContainerBuilder $container)
287229
{
288230
$bundles = $container->getParameter('kernel.bundles');
289231
if ('auto' === $config['use_sonata_admin'] && !isset($bundles['SonataDoctrinePHPCRAdminBundle'])) {
290232
return;
291233
}
292234

293-
$basePath = $config['admin_basepath'] ?: reset($config['route_basepaths']);
294-
$container->setParameter($this->getAlias() . '.dynamic.persistence.phpcr.admin_basepath', $basePath);
295-
296235
$loader->load('admin-phpcr.xml');
297236

237+
$basePath = $config['admin_basepath'] ?: reset($config['route_basepaths']);
238+
$container->setParameter('cmf_routing.dynamic.persistence.phpcr.admin_basepath', $basePath);
239+
298240
if ($config['enable_initializer']) {
299241
$loader->load('initializer-phpcr.xml');
300242
}
301243
}
302244

303-
public function loadOrmProvider($config, XmlFileLoader $loader, ContainerBuilder $container, $matchImplicitLocale)
245+
private function loadOrmProvider($config, XmlFileLoader $loader, ContainerBuilder $container, $matchImplicitLocale)
304246
{
305-
$container->setParameter($this->getAlias() . '.dynamic.persistence.orm.manager_name', $config['manager_name']);
306-
$container->setParameter($this->getAlias() . '.backend_type_orm', true);
307247
$loader->load('provider-orm.xml');
308248

249+
$container->setParameter('cmf_routing.backend_type_orm', true);
250+
$container->setParameter('cmf_routing.dynamic.persistence.orm.manager_name', $config['manager_name']);
251+
309252
if (!$matchImplicitLocale) {
310253
// remove the locales argument from the candidates
311-
$definition = $container->getDefinition($this->getAlias() . '.orm_candidates');
312-
$definition->setArguments(array());
254+
$container->getDefinition('cmf_routing.orm_candidates')->setArguments(array());
255+
}
256+
}
257+
258+
/**
259+
* @param ContainerBuilder $container The container builder
260+
* @param array $config The config array
261+
* @param array $settingToParameter An array with setting to parameter mappings (key = setting, value = parameter name without alias prefix)
262+
*/
263+
private function configureParameters(ContainerBuilder $container, array $config, array $settingToParameter)
264+
{
265+
foreach ($settingToParameter as $setting => $parameter) {
266+
$container->setParameter('cmf_routing.'.$parameter, $config[$setting]);
313267
}
314-
$container->setAlias(
315-
$this->getAlias() . '.content_repository',
316-
$this->getAlias() . '.orm_content_repository'
317-
);
318268
}
319269

320270
/**

0 commit comments

Comments
 (0)