From 8837c1f9ab8db1634623ecc4ccdcbe688109eeb7 Mon Sep 17 00:00:00 2001 From: Rogelio Jacinto Date: Sat, 23 Dec 2023 08:07:45 -0700 Subject: [PATCH] [10.x] Avoid TypeError when using json validation rule when PHP < 8.3 (#49474) * test: validateJson should return false when value is null Fails with Laravel Framework 10.38.2 in PHP < 8.3, introduced in #49413 * fix: validateJson should return false when value is null Return false when $value is null. Avoid TypeError: json_validate(): Argument #1 ($json) must be of type string, null given, when using symfony/polyfill-php83 in PHP < 8.3. Avoid deprecation warning: json_validate(): Passing null to parameter #1 ($json) of type string is deprecated, when using PHP 8.3. --------- Co-authored-by: Rogelio Jacinto --- .../Validation/Concerns/ValidatesAttributes.php | 4 ++-- tests/Validation/ValidationValidatorTest.php | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 312c0b71e34c..b4335fe90059 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1430,11 +1430,11 @@ public function validateMacAddress($attribute, $value) */ public function validateJson($attribute, $value) { - if (is_array($value)) { + if (is_array($value) || is_null($value)) { return false; } - if (! is_scalar($value) && ! is_null($value) && ! method_exists($value, '__toString')) { + if (! is_scalar($value) && ! method_exists($value, '__toString')) { return false; } diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index f86123de3a70..aee3f9842100 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -19,6 +19,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Support\Exceptions\MathException; +use Illuminate\Support\Stringable; use Illuminate\Translation\ArrayLoader; use Illuminate\Translation\Translator; use Illuminate\Validation\DatabasePresenceVerifierInterface; @@ -2817,6 +2818,14 @@ public function testValidateJson() $trans = $this->getIlluminateArrayTranslator(); $v = new Validator($trans, ['foo' => ['array']], ['foo' => 'json']); $this->assertFalse($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['foo' => null], ['foo' => 'json']); + $this->assertFalse($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['foo' => new Stringable('[]')], ['foo' => 'json']); + $this->assertTrue($v->passes()); } public function testValidateBoolean()