Skip to content

Commit add040d

Browse files
[Validator] Fix registering "is_valid()" for #[Expression]
1 parent efc6929 commit add040d

File tree

5 files changed

+48
-23
lines changed

5 files changed

+48
-23
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
use Symfony\Component\Translation\Translator;
174174
use Symfony\Component\Uid\Factory\UuidFactory;
175175
use Symfony\Component\Uid\UuidV4;
176+
use Symfony\Component\Validator\Constraints\ExpressionLanguageProvider;
176177
use Symfony\Component\Validator\ConstraintValidatorInterface;
177178
use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader;
178179
use Symfony\Component\Validator\ObjectInitializerInterface;
@@ -1664,6 +1665,10 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
16641665
if (!class_exists(ExpressionLanguage::class)) {
16651666
$container->removeDefinition('validator.expression_language');
16661667
}
1668+
1669+
if (!class_exists(ExpressionLanguageProvider::class)) {
1670+
$container->removeDefinition('validator.expression_language_provider');
1671+
}
16671672
}
16681673

16691674
private function registerValidatorMapping(ContainerBuilder $container, array $config, array &$files): void

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
1616
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
1717
use Symfony\Component\Validator\Constraints\EmailValidator;
18+
use Symfony\Component\Validator\Constraints\ExpressionLanguageProvider;
1819
use Symfony\Component\Validator\Constraints\ExpressionValidator;
1920
use Symfony\Component\Validator\Constraints\NoSuspiciousCharactersValidator;
2021
use Symfony\Component\Validator\Constraints\NotCompromisedPasswordValidator;
@@ -82,11 +83,16 @@
8283

8384
->set('validator.expression_language', ExpressionLanguage::class)
8485
->args([service('cache.validator_expression_language')->nullOnInvalid()])
86+
->call('registerProvider', [
87+
service('validator.expression_language_provider')->ignoreOnInvalid(),
88+
])
8589

8690
->set('cache.validator_expression_language')
8791
->parent('cache.system')
8892
->tag('cache.pool')
8993

94+
->set('validator.expression_language_provider', ExpressionLanguageProvider::class)
95+
9096
->set('validator.email', EmailValidator::class)
9197
->args([
9298
abstract_arg('Default mode'),
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Validator\Constraints;
13+
14+
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
15+
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
16+
17+
class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
18+
{
19+
public function getFunctions(): array
20+
{
21+
return [
22+
new ExpressionFunction('is_valid', function (...$arguments) {
23+
return sprintf(
24+
'0 === $context->getValidator()->inContext($context)->validate(%s)->getViolations()->count()',
25+
implode(', ', $arguments)
26+
);
27+
}, function (array $variables, ...$arguments): bool {
28+
return 0 === $variables['context']->getValidator()->inContext($variables['context'])->validate(...$arguments)->getViolations()->count();
29+
}),
30+
];
31+
}
32+
}

src/Symfony/Component/Validator/Constraints/ExpressionValidator.php

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
namespace Symfony\Component\Validator\Constraints;
1313

14-
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
15-
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
1614
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
1715
use Symfony\Component\Validator\Constraint;
1816
use Symfony\Component\Validator\ConstraintValidator;
@@ -22,15 +20,14 @@
2220
* @author Fabien Potencier <fabien@symfony.com>
2321
* @author Bernhard Schussek <bschussek@symfony.com>
2422
*/
25-
class ExpressionValidator extends ConstraintValidator implements ExpressionFunctionProviderInterface
23+
class ExpressionValidator extends ConstraintValidator
2624
{
2725
private ExpressionLanguage $expressionLanguage;
2826

2927
public function __construct(ExpressionLanguage $expressionLanguage = null)
3028
{
3129
if ($expressionLanguage) {
32-
$this->expressionLanguage = clone $expressionLanguage;
33-
$this->expressionLanguage->registerProvider($this);
30+
$this->expressionLanguage = $expressionLanguage;
3431
}
3532
}
3633

@@ -56,25 +53,11 @@ public function validate(mixed $value, Constraint $constraint)
5653
}
5754
}
5855

59-
public function getFunctions(): array
60-
{
61-
return [
62-
new ExpressionFunction('is_valid', function (...$arguments) {
63-
return sprintf(
64-
'0 === $context->getValidator()->inContext($context)->validate(%s)->getViolations()->count()',
65-
implode(', ', $arguments)
66-
);
67-
}, function (array $variables, ...$arguments): bool {
68-
return 0 === $variables['context']->getValidator()->inContext($variables['context'])->validate(...$arguments)->getViolations()->count();
69-
}),
70-
];
71-
}
72-
7356
private function getExpressionLanguage(): ExpressionLanguage
7457
{
7558
if (!isset($this->expressionLanguage)) {
7659
$this->expressionLanguage = new ExpressionLanguage();
77-
$this->expressionLanguage->registerProvider($this);
60+
$this->expressionLanguage->registerProvider(new ExpressionLanguageProvider());
7861
}
7962

8063
return $this->expressionLanguage;

src/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
1515
use Symfony\Component\Validator\Constraints\Expression;
16+
use Symfony\Component\Validator\Constraints\ExpressionLanguageProvider;
1617
use Symfony\Component\Validator\Constraints\ExpressionValidator;
1718
use Symfony\Component\Validator\Constraints\NotNull;
1819
use Symfony\Component\Validator\Constraints\Range;
@@ -359,10 +360,8 @@ public function testIsValidExpressionInvalid()
359360
*/
360361
public function testCompileIsValid(string $expression, array $names, string $expected)
361362
{
362-
$provider = new ExpressionValidator();
363-
364363
$expressionLanguage = new ExpressionLanguage();
365-
$expressionLanguage->registerProvider($provider);
364+
$expressionLanguage->registerProvider(new ExpressionLanguageProvider());
366365

367366
$result = $expressionLanguage->compile($expression, $names);
368367

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy