8000 [FrameworkBundle] Implemented configuration to select the desired Val… · symfony/symfony@9b204c9 · GitHub
[go: up one dir, main page]

Skip to content 8000

Commit 9b204c9

Browse files
committed
[FrameworkBundle] Implemented configuration to select the desired Validator API
1 parent 0946dbe commit 9b204c9

21 files changed

+264
-103
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ class AddValidatorInitializersPass implements CompilerPassInterface
1919
{
2020
public function process(ContainerBuilder $container)
2121
{
22-
if (!$container->hasDefinition('validator')) {
22+
if (!$container->hasDefinition('validator.builder')) {
2323
return;
2424
}
2525

26+
$validatorBuilder = $container->getDefinition('validator.builder');
27+
2628
$initializers = array();
2729
foreach ($container->findTaggedServiceIds('validator.initializer') as $id => $attributes) {
2830
$initializers[] = new Reference($id);
2931
}
3032

31-
$container->getDefinition('validator')->replaceArgument(4, $initializers);
33+
$validatorBuilder->addMethodCall('addObjectInitializers', array($initializers));
3234
}
3335
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,25 @@ private function addValidationSection(ArrayNodeDefinition $rootNode)
444444
->children()
445445
->scalarNode('cache')->end()
446446
->booleanNode('enable_annotations')->defaultFalse()->end()
447+
->arrayNode('static_method')
448+
->defaultValue(array('loadClassMetadata'))
449+
->prototype('scalar')->end()
450+
->treatFalseLike(array())
451+
->validate()
452+
->ifTrue(function ($v) { return !is_array($v); })
453+
->then(function ($v) { return (array) $v; })
454+
->end()
455+
->end()
447456
->scalarNode('translation_domain')->defaultValue('validators')->end()
448457
->booleanNode('strict_email')->defaultFalse()->end()
458+
->enumNode('api')
459+
->values(array('2.4', '2.5', '2.5-bc', 'auto'))
460+
->defaultValue('auto')
461+
->beforeNormalization()
462+
->ifTrue(function ($v) { return is_scalar($v); })
463+
->then(function ($v) { return (string) $v; })
464+
->end()
465+
->end()
449466
->end()
450467
->end()
451468
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Symfony\Component\Finder\Finder;
2222
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
2323
use Symfony\Component\Config\FileLocator;
24+
use Symfony\Component\Validator\Validation;
2425

2526
/**
2627
* FrameworkExtension.
@@ -674,27 +675,57 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
674675

675676
$loader->load('validator.xml');
676677

678+
$validatorBuilder = $container->getDefinition('validator.builder');
679+
677680
$container->setParameter('validator.translation_domain', $config['translation_domain']);
678-
$container->setParameter('validator.mapping.loader.xml_files_loader.mapping_files', $this->getValidatorXmlMappingFiles($container));
679-
$container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $this->getValidatorYamlMappingFiles($container));
681+
682+
$xmlMappings = $this->getValidatorXmlMappingFiles($container);
683+
$yamlMappings = $this->getValidatorYamlMappingFiles($container);
684+
685+
if (count($xmlMappings) > 0) {
686+
$validatorBuilder->addMethodCall('addXmlMappings', array($xmlMappings));
687+
}
688+
689+
if (count($yamlMappings) > 0) {
690+
$validatorBuilder->addMethodCall('addYamlMappings', array($yamlMappings));
691+
}
680692

681693
$definition = $container->findDefinition('validator.email');
682694
$definition->replaceArgument(0, $config['strict_email']);
683695

684696
if (array_key_exists('enable_annotations', $config) && $config['enable_annotations']) {
685-
$loaderChain = $container->getDefinition('validator.mapping.loader.loader_chain');
686-
$arguments = $loaderChain->getArguments();
687-
array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader'));
688-
$loaderChain->setArguments($arguments);
697+
$validatorBuilder->addMethodCall('enableAnnotations', array(new Reference('annotation_reader')));
698+
}
699+
700+
if (array_key_exists('static_method', $config) && $config['static_method']) {
701+
foreach ($config['static_method'] as $methodName) {
702+
$validatorBuilder->addMethodCall('addMethodMapping', array($methodName));
703+
}
689704
}
690705

691706
if (isset($config['cache'])) {
692-
$container->getDefinition('validator.mapping.class_metadata_factory')
693-
->replaceArgument(1, new Reference('validator.mapping.cache.'.$config['cache']));
694707
$container->setParameter(
695708
'validator.mapping.cache.prefix',
696709
'validator_'.hash('sha256', $container->getParameter('kernel.root_dir'))
697710
);
711+
712+
$validatorBuilder->addMethodCall('setCache', array(new Reference('validator.mapping.cache.'.$config['cache'])));
713+
}
714+
715+
if ('auto' !== $config['api']) {
716+
switch ($config['api']) {
717+
case '2.4':
718+
$api = Validation::API_VERSION_2_4;
719+
break;
720+
case '2.5':
721+
$api = Validation::API_VERSION_2_5;
722+
break;
723+
default:
724+
$api = Validation::API_VERSION_2_5_BC;
725+
break;
726+
}
727+
728+
$validatorBuilder->addMethodCall('setApiVersion', array($api));
698729
}
699730
}
700731

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77

88
<xsd:element name="config" type="config" />
99

10+
<xsd:simpleType name="validator_api_version">
11+
<xsd:restriction base="xsd:string">
12+
<xsd:enumeration value="2.4" />
13+
<xsd:enumeration value="2.5" />
14+
<xsd:enumeration value="2.5-api" />
15+
</xsd:restriction>
16+
</xsd:simpleType>
17+
1018
<xsd:complexType name="config">
1119
<xsd:all>
1220
<xsd:element name="form" type="form" minOccurs="0" maxOccurs="1" />
@@ -151,9 +159,15 @@
151159
</xsd:complexType>
152160

153161
<xsd:complexType name="validation">
162+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
163+
<xsd:element name="static-method" type="xsd:string" />
164+
</xsd:choice>
165+
154166
<xsd:attribute name="enabled" type="xsd:boolean" />
155167
<xsd:attribute name="cache" type="xsd:string" />
156168
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
169+
<xsd:attribute name="static-method" type="xsd:boolean" />
170+
<xsd:attribute name="api" type="validator_api_version" />
157171
</xsd:complexType>
158172

159173
<xsd:complexType name="annotations">

src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.xml

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,34 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<parameters>
8-
<parameter key="validator.class">Symfony\Component\Validator\Validator</parameter>
8+
<parameter key="validator.class">Symfony\Component\Validator\ValidatorInterface</parameter>
9+
<parameter key="validator.builder.class">Symfony\Component\Validator\ValidatorBuilderInterface</parameter>
10+
<parameter key="validator.builder.factory.class">Symfony\Component\Validator\Validation</parameter>
911
<parameter key="validator.mapping.class_metadata_factory.class">Symfony\Component\Validator\Mapping\ClassMetadataFactory</parameter>
1012
<parameter key="validator.mapping.cache.apc.class">Symfony\Component\Validator\Mapping\Cache\ApcCache</parameter>
1113
<parameter key="validator.mapping.cache.prefix" />
12-
<parameter key="validator.mapping.loader.loader_chain.class">Symfony\Component\Validator\Mapping\Loader\LoaderChain</parameter>
13-
<parameter key="validator.mapping.loader.static_method_loader.class">Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader</parameter>
14-
<parameter key="validator.mapping.loader.annotation_loader.class">Symfony\Component\Validator\Mapping\Loader\AnnotationLoader</parameter>
15-
<parameter key="validator.mapping.loader.xml_files_loader.class">Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader</parameter>
16-
<parameter key="validator.mapping.loader.yaml_files_loader.class">Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader</parameter>
1714
<parameter key="validator.validator_factory.class">Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory</parameter>
18-
<parameter key="validator.mapping.loader.xml_files_loader.mapping_files" type="collection" />
19-
<parameter key="validator.mapping.loader.yaml_files_loader.mapping_files" type="collection" />
2015
<parameter key="validator.expression.class">Symfony\Component\Validator\Constraints\ExpressionValidator</parameter>
2116
<parameter key="validator.email.class">Symfony\Component\Validator\Constraints\EmailValidator</parameter>
2217
</parameters>
2318

2419
<services>
25-
<service id="validator" class="%validator.class%">
26-
<argument type="service" id="validator.mapping.class_metadata_factory" />
27-
<argument type="service" id="validator.validator_factory" />
28-
<argument type="service" id="translator" />
29-
<argument>%validator.translation_domain%</argument>
30-
<argument type="collection" />
31-
</service>
20+
<service id="validator" class="%validator.class%" factory-service="validator.builder" factory-method="getValidator" />
3221

33-
<service id="validator.mapping.class_metadata_factory" class="%validator.mapping.class_metadata_factory.class%" public="false">
34-
<argument type="service" id="validator.mapping.loader.loader_chain" />
35-
<argument>null</argument>
22+
<service id="validator.builder" class="%validator.builder.class%" factory-class="%validator.builder.factory.class%" factory-method="createValidatorBuilder" public="false">
23+
<call method="setValidatorFactory">
24+
<argument type="service" id="validator.validator_factory" />
25+
</call>
26+
<call method="setTranslator">
27+
<argument type="service" id="translator" />
28+
</call>
29+
<call method="setTranslationDomain">
30+
<argument>%validator.translation_domain%</argument>
31+
</call>
3632
</service>
3733

34+
<service id="validator.mapping.class_metadata_factory" alias="validator" public="false" />
35+
3836
<service id="validator.mapping.cache.apc" class="%validator.mapping.cache.apc.class%" public="false">
3937
<argument>%validator.mapping.cache.prefix%</argument>
4038
</service>
@@ -44,28 +42,6 @@
4442
<argument type="collection" />
4543
</service>
4644

47-
<service id="validator.mapping.loader.loader_chain" class="%validator.mapping.loader.loader_chain.class%" public="false">
48-
<argument type="collection">
49-
<argument type="service" id="validator.mapping.loader.static_method_loader" />
50-
<argument type="service" id="validator.mapping.loader.xml_files_loader" />
51-
<argument type="service" id="validator.mapping.loader.yaml_files_loader" />
52-
</argument>
53-
</service>
54-
55-
<service id="validator.mapping.loader.static_method_loader" class="%validator.mapping.loader.static_method_loader.class%" public="false" />
56-
57-
<service id="validator.mapping.loader.annotation_loader" class="%validator.mapping.loader.annotation_loader.class%" public="false">
58-
<argument type="service" id="annotation_reader" />
59-
</service>
60-
61-
<service id="validator.mapping.loader.xml_files_loader" class="%validator.mapping.loader.xml_files_loader.class%" public="false">
62-
<argument>%validator.mapping.loader.xml_files_loader.mapping_files%</argument>
63-
</service>
64-
65-
<service id="validator.mapping.loader.yaml_files_loader" class="%validator.mapping.loader.yaml_files_loader.class%" public="false">
66-
<argument>%validator.mapping.loader.yaml_files_loader.mapping_files%</argument>
67-
</service>
68-
6945
<service id="validator.expression" class="%validator.expression.class%">
7046
<argument type="service" id="property_accessor" />
7147
<tag name="validator.constraint_validator" alias="validator.expression" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,10 @@ protected static function getBundleDefaultConfig()
126126
'validation' => array(
127127
'enabled' => false,
128128
'enable_annotations' => false,
129+
'static_method' => array('loadClassMetadata'),
129130
'translation_domain' => 'validators',
130131
'strict_email' => false,
132+
'api' => 'auto',
131133
),
132134
'annotations' => array(
133135
'cache' => 'file',
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'secret' => 's3cr3t',
5+
'validation' => array(
6+
'enabled' => true,
7+
'api' => '2.4',
8+
),
9+
));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'secret' => 's3cr3t',
5+
'validation' => array(
6+
'enabled' => true,
7+
'static_method' => array('loadFoo', 'loadBar'),
8+
),
9+
));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'secret' => 's3cr3t',
5+
'validation' => array(
6+
'enabled' => true,
7+
'static_method' => false,
8+
),
9+
));
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:framework="http://symfony.com/schema/dic/symfony"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
7+
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
8+
9+
<framework:config secret="s3cr3t">
10+
<framework:validation enabled="true" api="2.4" />
11+
</framework:config>
12+
</container>

0 commit comments

Comments
 (0)
0