Skip to content

Commit 1da23d7

Browse files
Add DotEncodingParamResolver
1 parent 65990e7 commit 1da23d7

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

config/definition.php

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
->addDefaultsIfNotSet()
2222
->children()
2323
->booleanNode('property_path')->defaultTrue()->end()
24+
->booleanNode('dot_encoding')->defaultFalse()->end()
2425
->end()
2526
->end()
2627
->arrayNode('message_resolver')

config/services/param_resolver.php

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use SBSEDV\Bundle\FormBundle\ParamResolver\ChainParamResolver;
66
use SBSEDV\Bundle\FormBundle\ParamResolver\ConstraintViolationCustomErrorKeyParamResolver;
7+
use SBSEDV\Bundle\FormBundle\ParamResolver\DotEncodingParamResolver;
78
use SBSEDV\Bundle\FormBundle\ParamResolver\ParamResolverInterface;
89
use SBSEDV\Bundle\FormBundle\ParamResolver\PropertyPathParamResolver;
910

@@ -17,6 +18,9 @@
1718
->set(PropertyPathParamResolver::class)
1819
->tag('sbsedv_form.param_resolver', ['priority' => -9999])
1920

21+
->set(DotEncodingParamResolver::class)
22+
->tag('sbsedv_form.param_resolver', ['priority' => -9999])
23+
2024
->set(ConstraintViolationCustomErrorKeyParamResolver::class)
2125
->tag('sbsedv_form.param_resolver')
2226

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace SBSEDV\Bundle\FormBundle\ParamResolver;
4+
5+
use Symfony\Component\Form\FormError;
6+
7+
/**
8+
* @example key
9+
* @example key.nested
10+
* @example key.nested.deeply
11+
*/
12+
class DotEncodingParamResolver implements ParamResolverInterface
13+
{
14+
public function resolveParam(FormError $formError): ?string
15+
{
16+
$origin = $formError->getOrigin();
17+
18+
// this SHOULD NEVER happen
19+
if (null === $origin) {
20+
return null;
21+
}
22+
23+
$keys = [(string) $origin->getPropertyPath()];
24+
25+
$parent = $origin->getParent();
26+
while ($parent !== null && $parent->getName() !== '') {
27+
$keys[] = (string) $parent->getPropertyPath();
28+
$parent = $parent->getParent();
29+
}
30+
31+
$keys = \array_reverse($keys);
32+
foreach ($keys as $k => $v) {
33+
$keys[$k] = \str_replace(['[', ']'], '', $v);
34+
}
35+
36+
$key = \implode('.', $keys);
37+
38+
// @phpstan-ignore-next-line
39+
if ('' === $key) {
40+
return null;
41+
}
42+
43+
return $key;
44+
}
45+
}

src/ParamResolver/PropertyPathParamResolver.php

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
use Symfony\Component\Form\FormError;
66

7+
/**
8+
* @example key
9+
* @example key[nested]
10+
* @example key[nested][deeply]
11+
*/
712
class PropertyPathParamResolver implements ParamResolverInterface
813
{
914
public function resolveParam(FormError $formError): ?string

src/SBSEDVFormBundle.php

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
6363
if (!$config['param_resolver']['property_path']) {
6464
$container->services()->remove(ParamResolver\PropertyPathParamResolver::class);
6565
}
66+
67+
if (!$config['param_resolver']['dot_encoding']) {
68+
$container->services()->remove(ParamResolver\DotEncodingParamResolver::class);
69+
}
6670
}
6771

6872
public function configure(DefinitionConfigurator $definition): void

0 commit comments

Comments
 (0)