Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace Egulias\EmailValidator\Validation;
|
Chris@18
|
4
|
Chris@18
|
5 use Egulias\EmailValidator\EmailLexer;
|
Chris@18
|
6 use Egulias\EmailValidator\Validation\Exception\EmptyValidationList;
|
Chris@18
|
7
|
Chris@18
|
8 class MultipleValidationWithAnd implements EmailValidation
|
Chris@18
|
9 {
|
Chris@18
|
10 /**
|
Chris@18
|
11 * If one of validations gets failure skips all succeeding validation.
|
Chris@18
|
12 * This means MultipleErrors will only contain a single error which first found.
|
Chris@18
|
13 */
|
Chris@18
|
14 const STOP_ON_ERROR = 0;
|
Chris@18
|
15
|
Chris@18
|
16 /**
|
Chris@18
|
17 * All of validations will be invoked even if one of them got failure.
|
Chris@18
|
18 * So MultipleErrors will contain all causes.
|
Chris@18
|
19 */
|
Chris@18
|
20 const ALLOW_ALL_ERRORS = 1;
|
Chris@18
|
21
|
Chris@18
|
22 /**
|
Chris@18
|
23 * @var EmailValidation[]
|
Chris@18
|
24 */
|
Chris@18
|
25 private $validations = [];
|
Chris@18
|
26
|
Chris@18
|
27 /**
|
Chris@18
|
28 * @var array
|
Chris@18
|
29 */
|
Chris@18
|
30 private $warnings = [];
|
Chris@18
|
31
|
Chris@18
|
32 /**
|
Chris@18
|
33 * @var MultipleErrors
|
Chris@18
|
34 */
|
Chris@18
|
35 private $error;
|
Chris@18
|
36
|
Chris@18
|
37 /**
|
Chris@18
|
38 * @var bool
|
Chris@18
|
39 */
|
Chris@18
|
40 private $mode;
|
Chris@18
|
41
|
Chris@18
|
42 /**
|
Chris@18
|
43 * @param EmailValidation[] $validations The validations.
|
Chris@18
|
44 * @param int $mode The validation mode (one of the constants).
|
Chris@18
|
45 */
|
Chris@18
|
46 public function __construct(array $validations, $mode = self::ALLOW_ALL_ERRORS)
|
Chris@18
|
47 {
|
Chris@18
|
48 if (count($validations) == 0) {
|
Chris@18
|
49 throw new EmptyValidationList();
|
Chris@18
|
50 }
|
Chris@18
|
51
|
Chris@18
|
52 $this->validations = $validations;
|
Chris@18
|
53 $this->mode = $mode;
|
Chris@18
|
54 }
|
Chris@18
|
55
|
Chris@18
|
56 /**
|
Chris@18
|
57 * {@inheritdoc}
|
Chris@18
|
58 */
|
Chris@18
|
59 public function isValid($email, EmailLexer $emailLexer)
|
Chris@18
|
60 {
|
Chris@18
|
61 $result = true;
|
Chris@18
|
62 $errors = [];
|
Chris@18
|
63 foreach ($this->validations as $validation) {
|
Chris@18
|
64 $emailLexer->reset();
|
Chris@18
|
65 $validationResult = $validation->isValid($email, $emailLexer);
|
Chris@18
|
66 $result = $result && $validationResult;
|
Chris@18
|
67 $this->warnings = array_merge($this->warnings, $validation->getWarnings());
|
Chris@18
|
68 $errors = $this->addNewError($validation->getError(), $errors);
|
Chris@18
|
69
|
Chris@18
|
70 if ($this->shouldStop($result)) {
|
Chris@18
|
71 break;
|
Chris@18
|
72 }
|
Chris@18
|
73 }
|
Chris@18
|
74
|
Chris@18
|
75 if (!empty($errors)) {
|
Chris@18
|
76 $this->error = new MultipleErrors($errors);
|
Chris@18
|
77 }
|
Chris@18
|
78
|
Chris@18
|
79 return $result;
|
Chris@18
|
80 }
|
Chris@18
|
81
|
Chris@18
|
82 private function addNewError($possibleError, array $errors)
|
Chris@18
|
83 {
|
Chris@18
|
84 if (null !== $possibleError) {
|
Chris@18
|
85 $errors[] = $possibleError;
|
Chris@18
|
86 }
|
Chris@18
|
87
|
Chris@18
|
88 return $errors;
|
Chris@18
|
89 }
|
Chris@18
|
90
|
Chris@18
|
91 private function shouldStop($result)
|
Chris@18
|
92 {
|
Chris@18
|
93 return !$result && $this->mode === self::STOP_ON_ERROR;
|
Chris@18
|
94 }
|
Chris@18
|
95
|
Chris@18
|
96 /**
|
Chris@18
|
97 * {@inheritdoc}
|
Chris@18
|
98 */
|
Chris@18
|
99 public function getError()
|
Chris@18
|
100 {
|
Chris@18
|
101 return $this->error;
|
Chris@18
|
102 }
|
Chris@18
|
103
|
Chris@18
|
104 /**
|
Chris@18
|
105 * {@inheritdoc}
|
Chris@18
|
106 */
|
Chris@18
|
107 public function getWarnings()
|
Chris@18
|
108 {
|
Chris@18
|
109 return $this->warnings;
|
Chris@18
|
110 }
|
Chris@18
|
111 }
|