Skip to content

Commit 7d1032b

Browse files
[Validator] Add D regex modifier in relevant validators
1 parent 8a0673b commit 7d1032b

13 files changed

+162
-36
lines changed

Diff for: src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php

+19-19
Original file line numberDiff line numberDiff line change
@@ -29,65 +29,65 @@ class CardSchemeValidator extends ConstraintValidator
2929
protected $schemes = [
3030
// American Express card numbers start with 34 or 37 and have 15 digits.
3131
CardScheme::AMEX => [
32-
'/^3[47][0-9]{13}$/',
32+
'/^3[47][0-9]{13}$/D',
3333
],
3434
// China UnionPay cards start with 62 and have between 16 and 19 digits.
3535
// Please note that these cards do not follow Luhn Algorithm as a checksum.
3636
CardScheme::CHINA_UNIONPAY => [
37-
'/^62[0-9]{14,17}$/',
37+
'/^62[0-9]{14,17}$/D',
3838
],
3939
// Diners Club card numbers begin with 300 through 305, 36 or 38. All have 14 digits.
4040
// There are Diners Club cards that begin with 5 and have 16 digits.
4141
// These are a joint venture between Diners Club and MasterCard, and should be processed like a MasterCard.
4242
CardScheme::DINERS => [
43-
'/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',
43+
'/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/D',
4444
],
4545
// Discover card numbers begin with 6011, 622126 through 622925, 644 through 649 or 65.
4646
// All have 16 digits.
4747
CardScheme::DISCOVER => [
48-
'/^6011[0-9]{12}$/',
49-
'/^64[4-9][0-9]{13}$/',
50-
'/^65[0-9]{14}$/',
51-
'/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/',
48+
'/^6011[0-9]{12}$/D',
49+
'/^64[4-9][0-9]{13}$/D',
50+
'/^65[0-9]{14}$/D',
51+
'/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/D',
5252
],
5353
// InstaPayment cards begin with 637 through 639 and have 16 digits.
5454
CardScheme::INSTAPAYMENT => [
55-
'/^63[7-9][0-9]{13}$/',
55+
'/^63[7-9][0-9]{13}$/D',
5656
],
5757
// JCB cards beginning with 2131 or 1800 have 15 digits.
5858
// JCB cards beginning with 35 have 16 digits.
5959
CardScheme::JCB => [
60-
'/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/',
60+
'/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/D',
6161
],
6262
// Laser cards begin with either 6304, 6706, 6709 or 6771 and have between 16 and 19 digits.
6363
CardScheme::LASER => [
64-
'/^(6304|670[69]|6771)[0-9]{12,15}$/',
64+
'/^(6304|670[69]|6771)[0-9]{12,15}$/D',
6565
],
6666
// Maestro international cards begin with 675900..675999 and have between 12 and 19 digits.
6767
// Maestro UK cards begin with either 500000..509999 or 560000..699999 and have between 12 and 19 digits.
6868
CardScheme::MAESTRO => [
69-
'/^(6759[0-9]{2})[0-9]{6,13}$/',
70-
'/^(50[0-9]{4})[0-9]{6,13}$/',
71-
'/^5[6-9][0-9]{10,17}$/',
72-
'/^6[0-9]{11,18}$/',
69+
'/^(6759[0-9]{2})[0-9]{6,13}$/D',
70+
'/^(50[0-9]{4})[0-9]{6,13}$/D',
71+
'/^5[6-9][0-9]{10,17}$/D',
72+
'/^6[0-9]{11,18}$/D',
7373
],
7474
// All MasterCard numbers start with the numbers 51 through 55. All have 16 digits.
7575
// October 2016 MasterCard numbers can also start with 222100 through 272099.
7676
CardScheme::MASTERCARD => [
77-
'/^5[1-5][0-9]{14}$/',
78-
'/^2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12})$/',
77+
'/^5[1-5][0-9]{14}$/D',
78+
'/^2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12})$/D',
7979
],
8080
// Payment system MIR numbers start with 220, then 1 digit from 0 to 4, then between 12 and 15 digits
8181
CardScheme::MIR => [
82-
'/^220[0-4][0-9]{12,15}$/',
82+
'/^220[0-4][0-9]{12,15}$/D',
8383
],
8484
// All UATP card numbers start with a 1 and have a length of 15 digits.
8585
CardScheme::UATP => [
86-
'/^1[0-9]{14}$/',
86+
'/^1[0-9]{14}$/D',
8787
],
8888
// All Visa card numbers start with a 4 and have a length of 13, 16, or 19 digits.
8989
CardScheme::VISA => [
90-
'/^4([0-9]{12}|[0-9]{15}|[0-9]{18})$/',
90+
'/^4([0-9]{12}|[0-9]{15}|[0-9]{18})$/D',
9191
],
9292
];
9393

Diff for: src/Symfony/Component/Validator/Constraints/CssColorValidator.php

+12-12
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,21 @@
2121
*/
2222
class CssColorValidator extends ConstraintValidator
2323
{
24-
private const PATTERN_HEX_LONG = '/^#[0-9a-f]{6}$/i';
25-
private const PATTERN_HEX_LONG_WITH_ALPHA = '/^#[0-9a-f]{8}$/i';
26-
private const PATTERN_HEX_SHORT = '/^#[0-9a-f]{3}$/i';
27-
private const PATTERN_HEX_SHORT_WITH_ALPHA = '/^#[0-9a-f]{4}$/i';
24+
private const PATTERN_HEX_LONG = '/^#[0-9a-f]{6}$/iD';
25+
private const PATTERN_HEX_LONG_WITH_ALPHA = '/^#[0-9a-f]{8}$/iD';
26+
private const PATTERN_HEX_SHORT = '/^#[0-9a-f]{3}$/iD';
27+
private const PATTERN_HEX_SHORT_WITH_ALPHA = '/^#[0-9a-f]{4}$/iD';
2828
// List comes from https://www.w3.org/wiki/CSS/Properties/color/keywords#Basic_Colors
29-
private const PATTERN_BASIC_NAMED_COLORS = '/^(black|silver|gray|white|maroon|red|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua)$/i';
29+
private const PATTERN_BASIC_NAMED_COLORS = '/^(black|silver|gray|white|maroon|red|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua)$/iD';
3030
// List comes from https://www.w3.org/wiki/CSS/Properties/color/keywords#Extended_colors
31-
private const PATTERN_EXTENDED_NAMED_COLORS = '/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)$/i';
31+
private const PATTERN_EXTENDED_NAMED_COLORS = '/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)$/iD';
3232
// List comes from https://drafts.csswg.org/css-color/#css-system-colors
33-
private const PATTERN_SYSTEM_COLORS = '/^(Canvas|CanvasText|LinkText|VisitedText|ActiveText|ButtonFace|ButtonText|ButtonBorder|Field|FieldText|Highlight|HighlightText|SelectedItem|SelectedItemText|Mark|MarkText|GrayText)$/i';
34-
private const PATTERN_KEYWORDS = '/^(transparent|currentColor)$/i';
35-
private const PATTERN_RGB = '/^rgb\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d)\s*\)$/i';
36-
private const PATTERN_RGBA = '/^rgba\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|0?\.\d+|1(\.0)?)\s*\)$/i';
37-
private const PATTERN_HSL = '/^hsl\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%\s*\)$/i';
38-
private const PATTERN_HSLA = '/^hsla\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%,\s*(0|0?\.\d+|1(\.0)?)\s*\)$/i';
33+
private const PATTERN_SYSTEM_COLORS = '/^(Canvas|CanvasText|LinkText|VisitedText|ActiveText|ButtonFace|ButtonText|ButtonBorder|Field|FieldText|Highlight|HighlightText|SelectedItem|SelectedItemText|Mark|MarkText|GrayText)$/iD';
34+
private const PATTERN_KEYWORDS = '/^(transparent|currentColor)$/iD';
35+
private const PATTERN_RGB = '/^rgb\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d)\s*\)$/iD';
36+
private const PATTERN_RGBA = '/^rgba\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';
37+
private const PATTERN_HSL = '/^hsl\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%\s*\)$/iD';
38+
private const PATTERN_HSLA = '/^hsla\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%,\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';
3939

4040
private const COLOR_PATTERNS = [
4141
CssColor::HEX_LONG => self::PATTERN_HEX_LONG,

Diff for: src/Symfony/Component/Validator/Constraints/DateValidator.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
class DateValidator extends ConstraintValidator
2323
{
24-
public const PATTERN = '/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/';
24+
public const PATTERN = '/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/D';
2525

2626
/**
2727
* Checks whether a date is valid.

Diff for: src/Symfony/Component/Validator/Constraints/EmailValidator.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
*/
2626
class EmailValidator extends ConstraintValidator
2727
{
28-
private const PATTERN_HTML5 = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/';
29-
private const PATTERN_LOOSE = '/^.+\@\S+\.\S+$/';
28+
private const PATTERN_HTML5 = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/D';
29+
private const PATTERN_LOOSE = '/^.+\@\S+\.\S+$/D';
3030

3131
private const EMAIL_PATTERNS = [
3232
Email::VALIDATION_MODE_LOOSE => self::PATTERN_LOOSE,

Diff for: src/Symfony/Component/Validator/Constraints/TimeValidator.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
class TimeValidator extends ConstraintValidator
2323
{
24-
public const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/';
24+
public const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/D';
2525

2626
/**
2727
* Checks whether a time is valid.

Diff for: src/Symfony/Component/Validator/Constraints/UrlValidator.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class UrlValidator extends ConstraintValidator
4343
(?:/ (?:[\pL\pN\pS\pM\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path
4444
(?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
4545
(?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional)
46-
$~ixu';
46+
$~ixuD';
4747

4848
/**
4949
* {@inheritdoc}

Diff for: src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php

+30
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,36 @@ public function testValidNumbers($scheme, $number)
4646
$this->assertNoViolation();
4747
}
4848

49+
/**
50+
* @requires PHP 8
51+
*
52+
* @dataProvider getValidNumbers
53+
*/
54+
public function testValidNumbersWithNewLine($scheme, $number)
55+
{
56+
$this->validator->validate($number."\n", new CardScheme(['schemes' => $scheme, 'message' => 'myMessage']));
57+
58+
$this->buildViolation('myMessage')
59+
->setParameter('{{ value }}', '"'.$number."\n\"")
60+
->setCode(CardScheme::INVALID_FORMAT_ERROR)
61+
->assertRaised();
62+
}
63+
64+
/**
65+
* @requires PHP < 8
66+
*
67+
* @dataProvider getValidNumbers
68+
*/
69+
public function testValidNumbersWithNewLinePriorToPhp8($scheme, $number)
70+
{
71+
$this->validator->validate($number."\n", new CardScheme(['schemes' => $scheme, 'message' => 'myMessage']));
72+
73+
$this->buildViolation('myMessage')
74+
->setParameter('{{ value }}', '"'.$number."\n\"")
75+
->setCode(CardScheme::NOT_NUMERIC_ERROR)
76+
->assertRaised();
77+
}
78+
4979
public function testValidNumberWithOrderedArguments()
5080
{
5181
$this->validator->validate(

Diff for: src/Symfony/Component/Validator/Tests/Constraints/CssColorValidatorTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ public function testValidAnyColor($cssColor)
5252
$this->assertNoViolation();
5353
}
5454

55+
/**
56+
* @dataProvider getValidAnyColor
57+
*/
58+
public function testValidAnyColorWithNewLine($cssColor)
59+
{
60+
$this->validator->validate($cssColor."\n", new CssColor([], 'myMessage'));
61+
62+
$this->buildViolation('myMessage')
63+
->setParameter('{{ value }}', '"'.$cssColor."\n\"")
64+
->setCode(CssColor::INVALID_FORMAT_ERROR)
65+
->assertRaised();
66+
}
67+
5568
public static function getValidAnyColor(): array
5669
{
5770
return [

Diff for: src/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ public function testValidDates($date)
5353
$this->assertNoViolation();
5454
}
5555

56+
/**
57+
* @dataProvider getValidDates
58+
*/
59+
public function testValidDatesWithNewLine(string $date)
60+
{
61+
$this->validator->validate($date."\n", new Date(['message' => 'myMessage']));
62+
63+
$this->buildViolation('myMessage')
64+
->setParameter('{{ value }}', '"'.$date."\n\"")
65+
->setCode(Date::INVALID_FORMAT_ERROR)
66+
->assertRaised();
67+
}
68+
5669
public static function getValidDates()
5770
{
5871
return [

Diff for: src/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,19 @@ public function testValidEmails($email)
7070
$this->assertNoViolation();
7171
}
7272

73+
/**
74+
* @dataProvider getValidEmails
75+
*/
76+
public function testValidEmailsWithNewLine($email)
77+
{
78+
$this->validator->validate($email."\n", new Email());
79+
80+
$this->buildViolation('This value is not a valid email address.')
81+
->setParameter('{{ value }}', '"'.$email."\n\"")
82+
->setCode(Email::INVALID_FORMAT_ERROR)
83+
->assertRaised();
84+
}
85+
7386
public static function getValidEmails()
7487
{
7588
return [

Diff for: src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ public function testValidIbans($iban)
4848
$this->assertNoViolation();
4949
}
5050

51+
/**
52+
* @dataProvider getValidIbans
53+
*/
54+
public function testValidIbansWithNewLine(string $iban)
55+
{
56+
$this->validator->validate($iban."\n", new Iban());
57+
58+
$this->buildViolation('This is not a valid International Bank Account Number (IBAN).')
59+
->setParameter('{{ value }}', '"'.$iban."\n\"")
60+
->setCode(Iban::INVALID_CHARACTERS_ERROR)
61+
->assertRaised();
62+
}
63+
5164
public static function getValidIbans()
5265
{
5366
return [

Diff for: src/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php

+13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ public function testValidTimes($time)
5353
$this->assertNoViolation();
5454
}
5555

56+
/**
57+
* @dataProvider getValidTimes
58+
*/
59+
public function testValidTimesWithNewLine(string $time)
60+
{
61+
$this->validator->validate($time."\n", new Time());
62+
63+
$this->buildViolation('This value is not a valid time.')
64+
->setParameter('{{ value }}', '"'.$time."\n".'"')
65+
->setCode(Time::INVALID_FORMAT_ERROR)
66+
->assertRaised();
67+
}
68+
5669
public static function getValidTimes()
5770
{
5871
return [

Diff for: src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php

+31
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ public function testValidUrls($url)
6060
$this->assertNoViolation();
6161
}
6262

63+
/**
64+
* @dataProvider getValidUrls
65+
*/
66+
public function testValidUrlsWithNewLine($url)
67+
{
68+
$this->validator->validate($url."\n", new Url());
69+
70+
$this->buildViolation('This value is not a valid URL.')
71+
->setParameter('{{ value }}', '"'.$url."\n".'"')
72+
->setCode(Url::INVALID_URL_ERROR)
73+
->assertRaised();
74+
}
75+
6376
/**
6477
* @dataProvider getValidUrlsWithWhitespaces
6578
*/
@@ -85,6 +98,24 @@ public function testValidRelativeUrl($url)
8598
$this->assertNoViolation();
8699
}
87100

101+
/**
102+
* @dataProvider getValidRelativeUrls
103+
* @dataProvider getValidUrls
104+
*/
105+
public function testValidRelativeUrlWithNewLine(string $url)
106+
{
107+
$constraint = new Url([
108+
'relativeProtocol' => true,
109+
]);
110+
111+
$this->validator->validate($url."\n", $constraint);
112+
113+
$this->buildViolation('This value is not a valid URL.')
114+
->setParameter('{{ value }}', '"'.$url."\n".'"')
115+
->setCode(Url::INVALID_URL_ERROR)
116+
->assertRaised();
117+
}
118+
88119
public static function getValidRelativeUrls()
89120
{
90121
return [

0 commit comments

Comments
 (0)