Skip to content

Commit

Permalink
bug #36905 [Validator] Catch expected ValueError (derrabus)
Browse files Browse the repository at this point in the history
This PR was merged into the 3.4 branch.

Discussion
----------

[Validator] Catch expected ValueError

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | #36872
| License       | MIT
| Doc PR        | N/A

`mb_check_encoding()` raises a `ValueError` on php 8 if an invalid encoding was passed. The validator that was patched here is expected to fail gracefully in that situation. This PR restores that behavior under php 8.

Maybe we can reconsider this behavior for Symfony 5.2. It feels a bit odd to me because we swallow a potential misconfiguration of the validator.

Commits
-------

8f3f67f [Validator] Catch expected ValueError.
  • Loading branch information
nicolas-grekas committed May 23, 2020
2 parents 475a715 + 8f3f67f commit 42692d6
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions src/Symfony/Component/Validator/Constraints/LengthValidator.php
Expand Up @@ -39,8 +39,14 @@ public function validate($value, Constraint $constraint)

$stringValue = (string) $value;

if (!$invalidCharset = !@mb_check_encoding($stringValue, $constraint->charset)) {
$length = mb_strlen($stringValue, $constraint->charset);
try {
$invalidCharset = !@mb_check_encoding($stringValue, $constraint->charset);
} catch (\ValueError $e) {
if (!str_starts_with($e->getMessage(), 'mb_check_encoding(): Argument #2 ($encoding) must be a valid encoding')) {
throw $e;
}

$invalidCharset = true;
}

if ($invalidCharset) {
Expand All @@ -54,6 +60,8 @@ public function validate($value, Constraint $constraint)
return;
}

$length = mb_strlen($stringValue, $constraint->charset);

if (null !== $constraint->max && $length > $constraint->max) {
$this->context->buildViolation($constraint->min == $constraint->max ? $constraint->exactMessage : $constraint->maxMessage)
->setParameter('{{ value }}', $this->formatValue($stringValue))
Expand Down

0 comments on commit 42692d6

Please sign in to comment.