From c2ce388b5ae496eee93e3880fe0514888f2744b1 Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Thu, 15 Aug 2019 17:39:18 +0200 Subject: [PATCH 1/2] Implement better email validation support These changes allow for multiple email validators to be added when checking for valid emails. This is a continuation of the previous PR: https://github.com/laravel/framework/pull/26503 Basically this allows for two things: - Make use of multiple email validators provided by the egulias/email-validator package - Use the previous (and much requested) filter_var validation By default nothing's breaking because it'll still use the RFC validator to when no validators are passed to the email validation rule. But you can opt to include different ones or multiple ones: 'email' => 'email:rfc,dns' Or opt for the pre-5.8 behavior: 'email' => 'email:filter' Which will use `filter_var` to validate the email address. This should give people a little more flexibility when doing email validation. --- .../Concerns/FilterEmailValidation.php | 44 +++++++++++++++++++ .../Concerns/ValidatesAttributes.php | 29 ++++++++++-- tests/Validation/ValidationValidatorTest.php | 12 +++++ 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 src/Illuminate/Validation/Concerns/FilterEmailValidation.php diff --git a/src/Illuminate/Validation/Concerns/FilterEmailValidation.php b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php new file mode 100644 index 00000000000..e4fe06b8529 --- /dev/null +++ b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php @@ -0,0 +1,44 @@ +isValid($value, new RFCValidation); + $validations = collect($parameters) + ->unique() + ->map(function ($validation) { + if ($validation === 'rfc') { + return new RFCValidation(); + } elseif ($validation === 'strict') { + return new NoRFCWarningsValidation(); + } elseif ($validation === 'dns') { + return new DNSCheckValidation(); + } elseif ($validation === 'spoof') { + return new SpoofCheckValidation(); + } elseif ($validation === 'filter') { + return new FilterEmailValidation(); + } + }) + ->values() + ->all() ?: [new RFCValidation()]; + + return (new EmailValidator)->isValid($value, new MultipleValidationWithAnd($validations)); } /** diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 3db1e06c0c0..7a2866cb74b 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -2138,6 +2138,18 @@ public function testValidateEmailWithInternationalCharacters() $this->assertTrue($v->passes()); } + public function testValidateEmailWithStrictCheck() + { + $v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'foo@bar '], ['x' => 'email:strict']); + $this->assertFalse($v->passes()); + } + + public function testValidateEmailWithFilterCheck() + { + $v = new Validator($this->getIlluminateArrayTranslator(), ['x' => 'foo@bar'], ['x' => 'email:filter']); + $this->assertFalse($v->passes()); + } + /** * @dataProvider validUrls */ From ff866317312d3d0b34a883170f14732b36cf3296 Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Thu, 15 Aug 2019 17:49:25 +0200 Subject: [PATCH 2/2] Fix code style issues --- src/Illuminate/Validation/Concerns/FilterEmailValidation.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/FilterEmailValidation.php b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php index e4fe06b8529..cc38acead0c 100644 --- a/src/Illuminate/Validation/Concerns/FilterEmailValidation.php +++ b/src/Illuminate/Validation/Concerns/FilterEmailValidation.php @@ -3,9 +3,9 @@ namespace Illuminate\Validation\Concerns; use Egulias\EmailValidator\EmailLexer; +use Egulias\EmailValidator\Warning\Warning; use Egulias\EmailValidator\Exception\InvalidEmail; use Egulias\EmailValidator\Validation\EmailValidation; -use Egulias\EmailValidator\Warning\Warning; class FilterEmailValidation implements EmailValidation { @@ -29,7 +29,6 @@ public function isValid($email, EmailLexer $emailLexer) */ public function getError() { - return null; } /**