Skip to content

Commit 6eea3fa

Browse files
authored
Merge pull request #53 from milwad-dev/fix-validate-phone
[1.x] Add validate phone number methods for Langs
2 parents 625e1b9 + ad1ff0d commit 6eea3fa

File tree

3 files changed

+233
-20
lines changed

3 files changed

+233
-20
lines changed

src/Utils/Country.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class Country
4242

4343
public const CHAD = 'TD';
4444

45+
public const CHINA = 'zh';
46+
4547
public const COMOROS = 'KM';
4648

4749
public const CONGO = 'CG';
@@ -64,6 +66,8 @@ class Country
6466

6567
public const EL_SALVADOR = 'SV';
6668

69+
public const ENGLAND = 'EN';
70+
6771
public const EQUATORIAL_GUINEA = 'GQ';
6872

6973
public const ESTONIA = 'EE';
@@ -98,6 +102,10 @@ class Country
98102

99103
public const ICELAND = 'IS';
100104

105+
public const INDIA = 'IN';
106+
107+
public const INDONESIA = 'ID';
108+
101109
public const IRAN = 'IR';
102110

103111
public const IRAQ = 'IQ';
@@ -112,12 +120,16 @@ class Country
112120

113121
public const JORDAN = 'JO';
114122

123+
public const JAPAN = 'JA';
124+
115125
public const KAZAKHSTAN = 'KZ';
116126

117127
public const KOSOVO = 'XK';
118128

119129
public const KUWAIT = 'KW';
120130

131+
public const KOREAN = 'KO';
132+
121133
public const LATVIA = 'LV';
122134

123135
public const LEBANON = 'LB';

src/Utils/CountryPhoneCallback.php

Lines changed: 148 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,180 @@ class CountryPhoneCallback
1111
* @param string $code The country codes to validate against. String can be separated by comma
1212
* @param string|null $attribute
1313
*/
14-
public function __construct(protected $value, protected string $code, $attribute = null)
14+
public function __construct(private mixed $value, private string $code, string|null $attribute = null)
1515
{
1616
}
1717

18-
protected function validateTG()
18+
// TODO: Add a feature to add validate method for your own country!
19+
20+
/**
21+
* Validate Iran phone number.
22+
*
23+
* @return false|int
24+
*/
25+
protected function validateIR()
1926
{
20-
return preg_match('/^(?:\+228|00228|228)?\d{8}$/', $this->value);
27+
return preg_match('/^(\+98|0)?9\d{9}$/', $this->value);
2128
}
2229

30+
/**
31+
* Validate Iran phone number.
32+
*
33+
* @return false|int
34+
*/
35+
protected function validateEN()
36+
{
37+
return preg_match('/^(?:\+44|0)7\d{9}$/', $this->value);
38+
}
39+
40+
/**
41+
* Validate Nigeria phone number.
42+
*
43+
* @return false|int
44+
*/
2345
protected function validateNE()
2446
{
25-
return preg_match('/^(?:\+227|00227|227)?\d{8}$/', $this->value);
47+
return preg_match('/^(\+227|00227|227)?\d{8}$/', $this->value);
2648
}
2749

28-
protected function validateGW()
50+
/**
51+
* Validate Saudi Arabia phone number.
52+
*
53+
* @return false|int
54+
*/
55+
protected function validateSA()
2956
{
30-
return preg_match('/^(?:\+245|00245|245)?\d{7,8}$/', $this->value);
57+
return preg_match('/^((\+966)|0)?5\d{8}$/', $this->value);
3158
}
3259

33-
protected function validateTD()
60+
/**
61+
* Validate Germany phone number.
62+
*
63+
* @return false|int
64+
*/
65+
protected function validateDE()
3466
{
35-
return preg_match('/^(?:\+235|00235|235)?\d{8}$/', $this->value);
67+
return preg_match('/^((\+49)|(0))(1|15|16|17|19|30|31|32|33|34|40|41|42|43|44|49|151|152|153|155|156|157|159|160|162|163|180|181|182|183|184|185|186|187|188|170|171|172|173|174|175|176|177|178|179)\d{7,8}$/', $this->value);
3668
}
3769

38-
protected function validateCM()
70+
/**
71+
* Validate Greece phone number.
72+
*
73+
* @return false|int
74+
*/
75+
protected function validateGR()
76+
{
77+
return preg_match('/^\+30[2-9]\d{2}\d{3}\d{4}$/', $this->value);
78+
}
79+
80+
/**
81+
* Validate Spain phone number.
82+
*
83+
* @return false|int
84+
*/
85+
protected function validateES()
3986
{
40-
return preg_match('/^(?:\+237|00237|237)?\d{8}$/', $this->value);
87+
return preg_match('/^(?:\+34|0034|34)?[6789]\d{8}$/', $this->value);
4188
}
4289

43-
protected function validateBF()
90+
/**
91+
* Validate France phone number.
92+
*
93+
* @return false|int
94+
*/
95+
protected function validateFR()
4496
{
45-
return preg_match('/^(?:\+226|00226|226)?\d{8}$/', $this->value);
97+
return preg_match('/^(?:\+33|0033|0)(?:(?:[1-9](?:\d{2}){4})|(?:[67]\d{8}))$/', $this->value);
4698
}
4799

48-
protected function validateAO(): bool
100+
/**
101+
* Validate India phone number.
102+
*
103+
* @return false|int
104+
*/
105+
protected function validateIN()
49106
{
50-
return preg_match('/^(?:\+244|00244|244)?[9,2][1-9]\d{7}$/', $this->value);
107+
return preg_match('/^(?:(?:\+|0{0,2})91(\s|-)?)?[6789]\d{9}$/', $this->value);
51108
}
52109

53-
protected function validateBJ(): bool
110+
/**
111+
* Validate Indonesia phone number.
112+
*
113+
* @return false|int
114+
*/
115+
protected function validateID()
54116
{
55-
return preg_match('/^(?:\+229|00229|229)?\d{8}$/', $this->value);
117+
return preg_match('/^(?:\+62|0)(?:\d{2,3}\s?){1,2}\d{4,8}$/', $this->value);
118+
}
119+
120+
/**
121+
* Validate Italy phone number.
122+
*
123+
* @return false|int
124+
*/
125+
protected function validateIT()
126+
{
127+
return preg_match('/^\+39\d{8,10}$/', $this->value);
128+
}
129+
130+
/**
131+
* Validate Japanese phone number.
132+
*
133+
* @return false|int
134+
*/
135+
protected function validateJA()
136+
{
137+
return preg_match('/(\d{2,3})-?(\d{3,4})-?(\d{4})/', $this->value);
138+
}
139+
140+
/**
141+
* Validate Korean phone number.
142+
*
143+
* @return false|int
144+
*/
145+
protected function validateKO()
146+
{
147+
return preg_match('/^(?:\+82|0)(?:10|1[1-9])-?\d{3,4}-?\d{4}$/', $this->value);
148+
}
149+
150+
/**
151+
* Validate Russian phone number.
152+
*
153+
* @return false|int
154+
*/
155+
protected function validateRU()
156+
{
157+
return preg_match('/^(?:\+7|8)(?:\s?\(?\d{3}\)?\s?\d{3}(?:-?\d{2}){2}|\s?\d{2}(?:\s?\d{2}){3})$/', $this->value);
158+
}
159+
160+
/**
161+
* Validate Sweden phone number.
162+
*
163+
* @return false|int
164+
*/
165+
protected function validateSE()
166+
{
167+
return preg_match('/^(?:\+46|0) ?(?:[1-9]\d{1,2}-?\d{2}(?:\s?\d{2}){2}|7\d{2}-?\d{2}(?:\s?\d{2}){2})$/', $this->value);
168+
}
169+
170+
/**
171+
* Validate Turkey phone number.
172+
*
173+
* @return false|int
174+
*/
175+
protected function validateTR()
176+
{
177+
return preg_match('/^(?:\+90|0)(?:\s?[1-9]\d{2}\s?\d{3}\s?\d{2}\s?\d{2}|[1-9]\d{2}-?\d{3}-?\d{2}-?\d{2})$/', $this->value);
178+
}
179+
180+
/**
181+
* Validate Chinese phone number.
182+
*
183+
* @return false|int
184+
*/
185+
protected function validateZH()
186+
{
187+
return preg_match('/^(?:\+86)?1[3-9]\d{9}$/', $this->value);
56188
}
57189

58190
/**
@@ -65,9 +197,7 @@ protected function validateBJ(): bool
65197
public function callPhoneValidator(): array
66198
{
67199
$results = [];
68-
69200
$codes = explode(',', $this->code);
70-
71201
$codes = array_map('strtoupper', $codes);
72202

73203
foreach ($codes as $code) {

tests/Rules/ValidPhoneNumberTest.php

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Milwad\LaravelValidate\Tests\Rules;
44

5+
use BadMethodCallException;
56
use Milwad\LaravelValidate\Rules\ValidPhoneNumber;
67
use Milwad\LaravelValidate\Tests\BaseTest;
78
use Milwad\LaravelValidate\Utils\Country;
@@ -46,14 +47,84 @@ public function phone_number_is_not_valid()
4647
{
4748
$rules = [
4849
'phone_number' => [new ValidPhoneNumber()],
49-
'phone_bj' => [new ValidPhoneNumber(Country::BENIN)],
50+
'phone_bj' => [new ValidPhoneNumber(Country::IRAN)],
5051
];
5152
$data = [
5253
'phone_number' => '123456789',
53-
'phone_bj' => '+22697000000',
54+
'phone_bj' => '09120000000',
5455
];
5556
$passes = $this->app['validator']->make($data, $rules)->passes();
5657

5758
$this->assertFalse($passes);
5859
}
60+
61+
/**
62+
* Test all phone number is valid by specific code.
63+
*
64+
* @test
65+
*
66+
* @return void
67+
*/
68+
public function all_phone_number_is_valid_by_specific_code()
69+
{
70+
$rules = [
71+
'phone_ir' => [new ValidPhoneNumber(Country::IRAN)],
72+
'phone_en' => [new ValidPhoneNumber(Country::ENGLAND)],
73+
'phone_ne' => [new ValidPhoneNumber(Country::NIGER)],
74+
'phone_sa' => [new ValidPhoneNumber(Country::SAUDI_ARABIA)],
75+
'phone_de' => [new ValidPhoneNumber(Country::GERMANY)],
76+
'phone_gr' => [new ValidPhoneNumber(Country::GREECE)],
77+
'phone_es' => [new ValidPhoneNumber(Country::SPAIN)],
78+
'phone_fr' => [new ValidPhoneNumber(Country::FRANCE)],
79+
'phone_in' => [new ValidPhoneNumber(Country::INDIA)],
80+
'phone_id' => [new ValidPhoneNumber(Country::INDONESIA)],
81+
'phone_it' => [new ValidPhoneNumber(Country::ITALY)],
82+
'phone_ja' => [new ValidPhoneNumber(Country::JAPAN)],
83+
'phone_ko' => [new ValidPhoneNumber(Country::KOREAN)],
84+
'phone_ru' => [new ValidPhoneNumber(Country::RUSSIA)],
85+
'phone_se' => [new ValidPhoneNumber(Country::SWEDEN)],
86+
'phone_tr' => [new ValidPhoneNumber(Country::TURKEY)],
87+
'phone_ch' => [new ValidPhoneNumber(Country::CHINA)],
88+
];
89+
$data = [
90+
'phone_ir' => '09125555555',
91+
'phone_en' => '+447975777666',
92+
'phone_ne' => '+22799123456',
93+
'phone_sa' => '+966541234567',
94+
'phone_de' => '+4915123456789',
95+
'phone_gr' => '+302101234567',
96+
'phone_es' => '+34678901234',
97+
'phone_fr' => '+33612345678',
98+
'phone_in' => '+919876543210',
99+
'phone_id' => '+62812345678',
100+
'phone_it' => '+39123456789',
101+
'phone_ja' => '+819012345678',
102+
'phone_ko' => '+821012345678',
103+
'phone_ru' => '+79101234567',
104+
'phone_se' => '+46701234567',
105+
'phone_tr' => '+905551234567',
106+
'phone_ch' => '+8613812345678',
107+
];
108+
$passes = $this->app['validator']->make($data, $rules)->passes();
109+
110+
$this->assertTrue($passes);
111+
}
112+
113+
/**
114+
* Test if phone number validate method is not exists, will be thrown an exception.
115+
*
116+
* @test
117+
*
118+
* @return void
119+
*/
120+
public function if_phone_number_validate_method_is_not_exists()
121+
{
122+
$this->expectException(BadMethodCallException::class);
123+
$this->expectExceptionMessage("Validator method 'validateAZ' does not exist.");
124+
125+
$rules = ['phone' => [new ValidPhoneNumber(Country::AZERBAIJAN)]];
126+
$data = ['phone' => '+62812345678'];
127+
128+
$this->app['validator']->make($data, $rules)->passes();
129+
}
59130
}

0 commit comments

Comments
 (0)