Skip to content

Commit 69542e4

Browse files
committed
Validate phone by country code
1 parent 3587d81 commit 69542e4

File tree

5 files changed

+77
-6
lines changed

5 files changed

+77
-6
lines changed

config/laravel-validate.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
'name' => 'base64',
99
'class' => ValidBase64::class,
1010
],
11-
],
11+
]
1212
];

src/Rules/ValidPhoneNumber.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22

33
namespace Milwad\LaravelValidate\Rules;
44

5+
use Exception;
56
use Illuminate\Contracts\Validation\Rule;
7+
use Milwad\LaravelValidate\Utils\CountryPhoneCallback;
68

79
class ValidPhoneNumber implements Rule
810
{
11+
public function __construct(protected ?string $code = null)
12+
{
13+
}
914
/**
1015
* Check phone number is valid.
1116
*
@@ -15,6 +20,10 @@ class ValidPhoneNumber implements Rule
1520
*/
1621
public function passes($attribute, $value)
1722
{
23+
if (is_string($this->code)) {
24+
$passes = (new CountryPhoneCallback($value, $this->code))->callPhoneValidator();
25+
return collect($passes)->some(fn ($passe) => $passe);
26+
}
1827
return preg_match('/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/', $value);
1928
}
2029

src/Utils/Country.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,4 @@ class Country
219219
public const UNITED_KINGDOM = 'GB';
220220

221221
public const VIRGIN_ISLANDS_BRITISH = 'VG';
222-
}
222+
}

src/Utils/CountryPhoneCallback.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils;
4+
5+
class CountryPhoneCallback
6+
{
7+
/**
8+
* Create a new phone validator instance.
9+
*
10+
* @param mixed $value The phone number to validate.
11+
* @param string $code The country codes to validate against. String can be separated by comma
12+
* @param string|null $attribute
13+
*/
14+
public function __construct(protected $value, protected string $code, $attribute = null)
15+
{
16+
}
17+
18+
19+
20+
protected function validateBJ(): bool
21+
{
22+
return preg_match('/^(\+229|00229|229)?\d{8}$/', $this->value);
23+
}
24+
25+
/**
26+
* Call the phone validator method for each country code and return the results.
27+
*
28+
* @throws \BadMethodCallException if the validator method for a country code does not exist.
29+
*
30+
* @return array An array of validation results, where each key is a country code and the value is either `true` or `false`.
31+
*/
32+
public function callPhoneValidator(): array
33+
{
34+
$results = [];
35+
36+
$codes = explode(',', $this->code);
37+
38+
$codes = array_map('strtoupper', $codes);
39+
40+
foreach ($codes as $code) {
41+
$methodName = 'validate' . $code;
42+
43+
if (method_exists($this, $methodName)) {
44+
$results[$code] = $this->{$methodName}();
45+
} else {
46+
throw new \BadMethodCallException("Validator method '{$methodName}' does not exist.");
47+
}
48+
}
49+
50+
return $results;
51+
}
52+
}

tests/Rules/ValidPhoneNumberTest.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Milwad\LaravelValidate\Rules\ValidPhoneNumber;
66
use Milwad\LaravelValidate\Tests\BaseTest;
7+
use Milwad\LaravelValidate\Utils\Country;
78

89
class ValidPhoneNumberTest extends BaseTest
910
{
@@ -24,8 +25,11 @@ protected function setUp(): void
2425
*/
2526
public function phone_number_is_valid()
2627
{
27-
$rules = ['phone_number' => [new ValidPhoneNumber()]];
28-
$data = ['phone_number' => '09366000000'];
28+
$rules = [
29+
'phone_number' => [new ValidPhoneNumber()],
30+
'phone_bj' => [new ValidPhoneNumber(Country::BENIN)]
31+
];
32+
$data = ['phone_number' => '09366000000', 'phone_bj' => "+22997000000"];
2933
$passes = $this->app['validator']->make($data, $rules)->passes();
3034

3135
$this->assertTrue($passes);
@@ -40,8 +44,14 @@ public function phone_number_is_valid()
4044
*/
4145
public function phone_number_is_not_valid()
4246
{
43-
$rules = ['phone_number' => [new ValidPhoneNumber()]];
44-
$data = ['phone_number' => '123456789'];
47+
$rules = [
48+
'phone_number' => [new ValidPhoneNumber()],
49+
'phone_bj' => [new ValidPhoneNumber(Country::BENIN)]
50+
];
51+
$data = [
52+
'phone_number' => '123456789',
53+
'phone_bj' => "+22697000000"
54+
];
4555
$passes = $this->app['validator']->make($data, $rules)->passes();
4656

4757
$this->assertFalse($passes);

0 commit comments

Comments
 (0)