8000 feature #19086 [FrameworkBundle] add "mapping" configuration key at v… · symfony/symfony@3697e1e · GitHub
[go: up one dir, main page]

Skip to content

Commit 3697e1e

Browse files
committed
feature #19086 [FrameworkBundle] add "mapping" configuration key at validation secti… (davewwww)
This PR was merged into the 3.3-dev branch. Discussion ---------- [FrameworkBundle] add "mapping" configuration key at validation secti… | Q | A | | --- | --- | | Bug fix? | no | | New feature? | yes | | BC breaks? | no | | Deprecations? | no | | Tests pass? | yes | | Fixed tickets | #15655 | | License | MIT | | Doc PR | symfony/symfony-docs#7407 | This feature allows you, to define additional validation files or directories which are not in the 'Bundle*/Resources/config/' directory. ``` yaml #config.yml framework: validation: mapping: paths: - "path/to/file/validation.yml" - "path/to/file/validation.xml" - "path/to/another/directory" ``` Commits ------- d696cfb [FrameworkBundle] Configurable paths for validation files 60d7d43 fix merge 61475b5 Merge branch '3.2' ba41e70 Merge branch '3.1' into 3.2 4268aba Merge branch '2.8' into 3.1 3faf655 Merge branch '2.7' into 2.8 e95fc09 fix getMock usage 482828c fix merge ed5eb6d bug #21372 [DependencyInjection] Fixed variadic method parameter in autowired classes (brainexe) a7f63de [DependencyInjection] Fixed variadic method parameter in autowired classes 9ef4271 minor #21371 [Validator] update German translation (xabbuh) f920e61 update German translation 41c72ab minor #21335 [Validator] Improved error message for missing upload_tmp_dir (Breuls) afbf227 [Validator] Improved error message for missing upload_tmp_dir
2 parents 71b8a66 + d696cfb commit 3697e1e

File tree

26 files changed

+173
-48
lines changed

26 files changed

+173
-48
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ CHANGELOG
1212
is disabled.
1313
* Added `GlobalVariables::getToken()`
1414
* Deprecated `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConsoleCommandPass`. Use `Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass` instead.
15+
* Added configurable paths for validation files
1516

1617
3.2.0
1718
-----

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

10000 Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,15 @@ private function addValidationSection(ArrayNodeDefinition $rootNode)
635635
->end()
636636
->scalarNode('translation_domain')->defaultValue('validators')->end()
637637
->booleanNode('strict_email')->defaultFalse()->end()
638+
->arrayNode('mapping')
639+
->addDefaultsIfNotSet()
640+
->fixXmlConfig('path')
641+
->children()
642+
->arrayNode('paths')
643+
->prototype('scalar')->end()
644+
->end()
645+
->end()
646+
->end()
638647
->end()
639648
->end()
640649
->end()

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

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -947,13 +947,16 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
947947

948948
$container->setParameter('validator.translation_domain', $config['translation_domain']);
949949

950-
list($xmlMappings, $yamlMappings) = $this->getValidatorMappingFiles($container);
951-
if (count($xmlMappings) > 0) {
952-
$validatorBuilder->addMethodCall('addXmlMappings', array($xmlMappings));
950+
$files = array('xml' => array(), 'yml' => array());
951+
$this->getValidatorMappingFiles($container, $files);
952+
$this->getValidatorMappingFilesFromConfig($config, $files);
953+
954+
if (!empty($files['xml'])) {
955+
$validatorBuilder->addMethodCall('addXmlMappings', array($files['xml']));
953956
}
954957

955-
if (count($yamlMappings) > 0) {
956-
$validatorBuilder->addMethodCall('addYamlMappings', array($yamlMappings));
958+
if (!empty($files['yml'])) {
959+
$validatorBuilder->addMethodCall('addYamlMappings', array($files['yml']));
957960
}
958961

959962
$definition = $container->findDefinition('validator.email');
@@ -987,41 +990,58 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
987990
}
988991
}
989992

990-
private function getValidatorMappingFiles(ContainerBuilder $container)
993+
private function getValidatorMappingFiles(ContainerBuilder $container, array &$files)
991994
{
992-
$files = array(array(), array());
993-
994995
if (interface_exists('Symfony\Component\Form\FormInterface')) {
995996
$reflClass = new \ReflectionClass('Symfony\Component\Form\FormInterface');
996-
$files[0][] = dirname($reflClass->getFileName()).'/Resources/config/validation.xml';
997-
$container->addResource(new FileResource($files[0][0]));
997+
$files['xml'][] = $file = dirname($reflClass->getFileName()).'/Resources/config/validation.xml';
998+
$container->addResource(new FileResource($file));
998999
}
9991000

10001001
foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
10011002
$dirname = $bundle['path'];
1002-
if (is_file($file = $dirname.'/Resources/config/validation.xml')) {
1003-
$files[0][] = $file;
1003+
1004+
if (is_file($file = $dirname.'/Resources/config/validation.yml')) {
1005+
$files['yml'][] = $file;
10041006
$container->addResource(new FileResource($file));
10051007
}
10061008

1007-
if (is_file($file = $dirname.'/Resources/config/validation.yml')) {
1008-
$files[1][] = $file;
1009+
if (is_file($file = $dirname.'/Resources/config/validation.xml')) {
1010+
$files['xml'][] = $file;
10091011
$container->addResource(new FileResource($file));
10101012
}
10111013

10121014
if (is_dir($dir = $dirname.'/Resources/config/validation')) {
1013-
foreach (Finder::create()->followLinks()->files()->in($dir)->name('*.xml') as $file) {
1014-
$files[0][] = $file->getPathname();
1015-
}
1016-
foreach (Finder::create()->followLinks()->files()->in($dir)->name('*.yml') as $file) {
1017-
$files[1][] = $file->getPathname();
1018-
}
1019-
1015+
$this->getValidatorMappingFilesFromDir($dir, $files);
10201016
$container->addResource(new DirectoryResource($dir));
10211017
}
10221018
}
1019+
}
1020+
1021+
private function getValidatorMappingFilesFromDir($dir, array &$files)
1022+
{
1023+
foreach (Finder::create()->followLinks()->files()->in($dir)->name('/\.(xml|ya?ml)$/') as $file) {
1024+
$extension = $file->getExtension();
1025+
$files['yaml' === $extension ? 'yml' : $extension][] = $file->getRealpath();
1026+
}
1027+
}
10231028

1024-
return $files;
1029+
private function getValidatorMappingFilesFromConfig(array $config, array &$files)
1030+
{
1031+
foreach ($config['mapping']['paths'] as $path) {
1032+
if (is_dir($path)) {
1033+
$this->getValidatorMappingFilesFromDir($path, $files);
1034+
} elseif (is_file($path)) {
1035+
if (preg_match('/\.(xml|ya?ml)$/', $path, $matches)) {
1036+
$extension = $matches[1];
1037+
$files['yaml' === $extension ? 'yml' : $extension][] = $path;
1038+
} else {
1039+
throw new \RuntimeException(sprintf('Unsupported mapping type in "%s", supported types are XML & Yaml.', $path));
1040+
}
1041+
} else {
1042+
throw new \RuntimeException(sprintf('Could not open file or directory "%s".', $path));
1043+
}
1044+
}
10251045
}
10261046

10271047
private function registerAnnotationsConfiguration(array $config, ContainerBuilder $container, $loader)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
<xsd:complexType name="validation">
177177
<xsd:choice minOccurs="0" maxOccurs="unbounded">
178178
<xsd:element name="static-method" type="xsd:string" />
179+
<xsd:element name="mapping" type="validation_mapping" />
179180
</xsd:choice>
180181

181182
<xsd:attribute name="enabled" type="xsd:boolean" />
@@ -184,6 +185,12 @@
184185
<xsd:attribute name="static-method" type="xsd:boolean" />
185186
</xsd:complexType>
186187

188+
<xsd:complexType name="validation_mapping">
189+
<xsd:sequence>
190+
<xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
191+
</xsd:sequence>
192+
</xsd:complexType>
193+
187194
<xsd:complexType name="annotations">
188195
<xsd:attribute name="cache" type="xsd:string" />
189196
<xsd:attribute name="debug" type="xsd:string" />

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ protected static function getBundleDefaultConfig()
212212
'static_method' => array('loadValidatorMetadata'),
213213
'translation_domain' => 'validators',
214214
'strict_email' => false,
215+
'mapping' => array(
216+
'paths' => array(),
217+
),
215218
),
216219
'annotations' => array(
217220
'cache' => 'php_array',

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/validation_mapping/files/foo.xml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/validation_mapping/files/foo.yml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yaml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yml

Whitespace-only changes.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'validation' => array(
5+
'mapping' => array(
6+
'paths' => array(
7+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/files',
8+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yml',
9+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yaml',
10+
),
11+
),
12+
),
13+
));
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
7+
<framework:config>
8+
<framework:validation>
9+
<framework:mapping>
10+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/files</framework:path>
11+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yml</framework:path>
12+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yaml</framework:path>
13+
</framework:mapping>
14+
</framework:validation>
15+
</framework:config>
16+
</container>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
framework:
2+
validation:
3+
mapping:
4+
paths:
5+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/files"
6+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yml"
7+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation_mapping/validation.yaml"

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,22 @@ public function testValidationNoStaticMethod()
584584
// no cache, no annotations, no static methods
585585
}
586586

587+
public function testValidationMapping()
588+
{
589+
$container = $this->createContainerFromFile('validation_mapping');
590+
591+
$calls = $container->getDefinition('validator.builder')->getMethodCalls();
592+
593+
$this->assertSame('addXmlMappings', $calls[3][0]);
594+
$this->assertCount(2, $calls[3][1][0]);
595+
596+
$this->assertSame('addYamlMappings', $calls[4][0]);
597+
$this->assertCount(3, $calls[4][1][0]);
598+
$this->assertContains('foo.yml', $calls[4][1][0][0]);
599+
$this->assertContains('validation.yml', $calls[4][1][0][1]);
600+
$this->assertContains('validation.yaml', $calls[4][1][0][2]);
601+
}
602+
587603
public function testFormsCanBeEnabledWithoutCsrfProtection()
588604
{
589605
$container = $this->createContainerFromFile('form_no_csrf');

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_1.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
alias_1
2-
~~~~~~~
1+
### alias_1
32

43
- Service: `service_1`
54
- Public: yes
65

7-
service_1
8-
~~~~~~~~~
6+
### service_1
97

108
- Class: `Full\Qualified\Class1`
119
- Public: yes

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/alias_with_definition_2.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
alias_2
2-
~~~~~~~
1+
### alias_2
32

43
- Service: `service_2`
54
- Public: no
65

7-
service_2
8-
~~~~~~~~~
6+
### service_2
97

108
- Class: `Full\Qualified\Class2`
119
- Public: no

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_arguments.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ Public services
44
Definitions
55
-----------
66

7-
definition_1
8-
~~~~~~~~~~~~
7+
### definition_1
98

109
- Class: `Full\Qualified\Class1`
1110
- Public: yes
@@ -22,14 +21,12 @@ definition_1
2221
Aliases
2322
-------
2423

25-
alias_1
26-
~~~~~~~
24+
### alias_1
2725

2826
- Service: `service_1`
2927
- Public: yes
3028

31-
alias_2
32-
~~~~~~~
29+
### alias_2
3330

3431
- Service: `service_2`
3532
- Public: no

src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Compiler/ExtensionPassTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,20 @@ public function testProcessDoesNotDropExistingFileLoaderMethodCalls()
2121
{
2222
$container = new ContainerBuilder();
2323
$container->setParameter('kernel.debug', false);
24+
$container->setParameter('kernel.root_dir', __DIR__);
2425

2526
$container->register('twig.app_variable', '\Symfony\Bridge\Twig\AppVariable');
2627
$container->register('templating', '\Symfony\Bundle\TwigBundle\TwigEngine');
28+
$container->register('twig.extension.yaml');
29+
$container->register('twig.extension.debug.stopwatch');
30+
$container->register('twig.extension.expression');
2731

2832
$nativeTwigLoader = new Definition('\Twig_Loader_Filesystem');
2933
$nativeTwigLoader->addMethodCall('addPath', array());
3034
$container->setDefinition('twig.loader.native_filesystem', $nativeTwigLoader);
3135

3236
$filesystemLoader = new Definition('\Symfony\Bundle\TwigBundle\Loader\FilesystemLoader');
37+
$filesystemLoader->setArguments(array(null, null, null));
3338
$filesystemLoader->addMethodCall('addPath', array());
3439
$container->setDefinition('twig.loader.filesystem', $filesystemLoader);
3540

src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ function () {},
255255

256256
// assertEquals() does not like NAN values.
257257
$this->assertEquals($array[$i][0], 'float');
258-
$this->assertNan($array[$i++][1]);
258+
$this->assertTrue(is_nan($array[$i++][1]));
259259
}
260260

261261
public function testRecursionInArguments()

src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,10 +428,11 @@ private static function getResourceMetadataForMethod(\ReflectionMethod $method)
428428
$class = false;
429429
}
430430

431+
$isVariadic = method_exists($parameter, 'isVariadic') && $parameter->isVariadic();
431432
$methodArgumentsMetadata[] = array(
432433
'class' => $class,
433434
'isOptional' => $parameter->isOptional(),
434-
'defaultValue' => $parameter->isOptional() ? $parameter->getDefaultValue() : null,
435+
'defaultValue' => ($parameter->isOptional() && !$isVariadic) ? $parameter->getDefaultValue() : null,
435436
);
436437
}
437438

src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Compiler\AutowirePass;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616
use Symfony\Component\DependencyInjection\Reference;
17+
use Symfony\Component\DependencyInjection\Tests\Fixtures\includes\FooVariadic;
1718

1819
/**
1920
* @author Kévin Dunglas <dunglas@gmail.com>
@@ -35,6 +36,23 @@ public function testProcess()
3536
$this->assertEquals('foo', (string) $container->getDefinition('bar')->getArgument(0));
3637
}
3738

39+
/**
40+
* @requires PHP 5.6
41+
*/
42+
public function testProcessVariadic()
43+
{
44+
$container = new ContainerBuilder();
45+
$container->register('foo', Foo::class);
46+
$definition = $container->register('fooVariadic', FooVariadic::class);
47+
$definition->setAutowired(true);
48+
49+
$pass = new AutowirePass();
50+
$pass->process($container);
51+
52+
$this->assertCount(1, $container->getDefinition('fooVariadic')->getArguments());
53+
$this->assertEquals('foo', (string) $container->getDefinition('fooVariadic')->getArgument(0));
54+
}
55+
3856
public function testProcessAutowireParent()
3957
{
4058
$container = new ContainerBuilder();
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures\includes;
4+
5+
use Symfony\Component\DependencyInjection\Tests\Compiler\Foo;
6+
7+
class FooVariadic
8+
{
9+
public function __construct(Foo $foo)
10+
{
11+
}
12+
13+
public function bar(...$arguments)
14+
{
15+
}
16+
}

src/Symfony/Component/Security/Core/Tests/User/LdapUserProviderTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,14 @@ public function testLoadUserByUsernameFailsIfMoreThanOneLdapPasswordsInEntry()
156156
*/
157157
public function testLoadUserByUsernameFailsIfEntryHasNoUidKeyAttribute()
158158
{
159-
$result = $this->getMock(CollectionInterface::class);
160-
$query = $this->getMock(QueryInterface::class);
159+
$result = $this->getMockBuilder(CollectionInterface::class)->getMock();
160+
$query = $this->getMockBuilder(QueryInterface::class)->getMock();
161161
$query
162162
->expects($this->once())
163163
->method('execute')
164164
->will($this->returnValue($result))
165165
;
166-
$ldap = $this->getMock(LdapInterface::class);
166+
$ldap = $this->getMockBuilder(LdapInterface::class)->getMock();
167167
$result
168168
->expects($this->once())
169169
->method('offsetGet')
@@ -321,14 +321,14 @@ public function testLoadUserByUsernameIsSuccessfulWithoutPasswordAttributeAndWro
321321

322322
public function testLoadUserByUsernameIsSuccessfulWithPasswordAttribute()
323323
{
324-
$result = $this->getMock(CollectionInterface::class);
325-
$query = $this->getMock(QueryInterface::class);
324+
$result = $this->getMockBuilder(CollectionInterface::class)->getMock();
325+
$query = $this->getMockBuilder(QueryInterface::class)->getMock();
326326
$query
327327
->expects($this->once())
328328
->method('execute')
329329
->will($this->returnValue($result))
330330
;
331-
$ldap = $this->getMock(LdapInterface::class);
331+
$ldap = $this->getMockBuilder(LdapInterface::class)->getMock();
332332
$result
333333
->expects($this->once())
334334
->method('offsetGet')

0 commit comments

Comments
 (0)
0