Skip to content

Commit fcb8857

Browse files
authored
Merge pull request #108 from vahidkaargar/1.x
[1.x] Validation for landline numbers
2 parents ced68db + fec3303 commit fcb8857

28 files changed

+548
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ return [
137137
| 38 | [ValidUsername](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-username.md) | Validate username for ex (milwad) |
138138
| 39 | [ValidUuid](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-uuid.md) | Validate uuid for ex (123e4567-e89b-12d3-a456-426655440000) |
139139
| 40 | [ValidVatId](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-vatid.md) | Validate european VAT ID ex (EL123456789123) |
140+
| 41 | [ValidLandlineNumber](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-landline-number.md) | Validate landline number |
140141

141142
<a name="support-languages"></a>
142143

config/laravel-validate.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@
1919
use Milwad\LaravelValidate\Utils\CountryPhoneValidator\TRPhoneValidator;
2020
use Milwad\LaravelValidate\Utils\CountryPhoneValidator\ZHPhoneValidator;
2121

22+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\CMLandlineValidator;
23+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\DELandlineValidator;
24+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ENLandlineValidator;
25+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ESLandlineValidator;
26+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\FRLandlineValidator;
27+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\GRLandlineValidator;
28+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\IDLandlineValidator;
29+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\INLandlineValidator;
30+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\IRLandlineValidator;
31+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ITLandlineValidator;
32+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\JALandlineValidator;
33+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\KOLandlineValidator;
34+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\NELandlineValidator;
35+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\RULandlineValidator;
36+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\SALandlineValidator;
37+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\SELandlineValidator;
38+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\TRLandlineValidator;
39+
use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ZHLandlineValidator;
40+
2241
return [
2342
/*
2443
* Mapping of country codes to their respective phone number validator classes.
@@ -47,6 +66,33 @@
4766
'ZH' => ZHPhoneValidator::class, // China
4867
],
4968

69+
/*
70+
* Mapping of country codes to their respective landline number validator classes.
71+
* Each validator enforces country-specific landline number formatting and validation rules.
72+
*
73+
* You can add custom country landline validator.
74+
*/
75+
'landline-country' => [
76+
'CM' => CMLandlineValidator::class, // Cameroon
77+
'DE' => DELandlineValidator::class, // Germany
78+
'EN' => ENLandlineValidator::class, // England
79+
'ES' => ESLandlineValidator::class, // Spain
80+
'FR' => FRLandlineValidator::class, // France
81+
'GR' => GRLandlineValidator::class, // Greece
82+
'ID' => IDLandlineValidator::class, // Indonesia
83+
'IN' => INLandlineValidator::class, // India
84+
'IR' => IRLandlineValidator::class, // Iran
85+
'IT' => ITLandlineValidator::class, // Italy
86+
'JA' => JALandlineValidator::class, // Japan
87+
'KO' => KOLandlineValidator::class, // South Korea
88+
'NE' => NELandlineValidator::class, // Netherlands
89+
'RU' => RULandlineValidator::class, // Russia
90+
'SA' => SALandlineValidator::class, // Saudi Arabia
91+
'SE' => SELandlineValidator::class, // Sweden
92+
'TR' => TRLandlineValidator::class, // Turkey
93+
'ZH' => ZHLandlineValidator::class, // China
94+
],
95+
5096
/*
5197
* If you want to use rules like 'required|ValidPhone' in your validations, you can change it to true.
5298
*/

docs/1.x/valid-landline-number.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
## ValidLandlineNumber
2+
3+
If you want to validate the landline number, you can use the `ValidLandlineNumber` rule:
4+
5+
```php
6+
use Milwad\LaravelValidate\Rules\ValidLandlineNumber;
7+
8+
return [
9+
'landline-number' => ['required', new ValidLandlineNumber()], // landline-number => +98212223343
10+
];
11+
```
12+
13+
Also, `ValidLandlineNumber` can validate landline numbers with a specific country code:
14+
15+
```php
16+
use Milwad\LaravelValidate\Rules\ValidLandlineNumber;
17+
use Milwad\LaravelValidate\Utils\Country;
18+
19+
return [
20+
'landline-number' => ['required', new ValidLandlineNumber(Country::GERMANY)], // landline-number => +49301234567
21+
];
22+
```
23+
24+
> **Note**
25+
> If you want to know which country's codes are supported by the `ValidLandlineNumber` Rule, you can search your country
26+
> on this [Countries Landline Number](#support-countries-landline-number) list.
27+
28+
<a name="support-countries-landline-number"></a>
29+
## Support Countries Landline Number
30+
31+
- ✅ IRAN
32+
- ✅ ENGLAND
33+
- ✅ NIGER
34+
- ✅ SAUDI_ARABIA
35+
- ✅ GERMANY
36+
- ✅ GREECE
37+
- ✅ SPAIN
38+
- ✅ FRANCE
39+
- ✅ INDIA
40+
- ✅ INDONESIA
41+
- ✅ ITALY
42+
- ✅ JAPAN
43+
- ✅ KOREAN
44+
- ✅ RUSSIA
45+
- ✅ SWEDEN
46+
- ✅ TURKEY
47+
- ✅ CHINA
48+
- ✅ CAMEROON

src/LaravelValidateServiceProvider.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Support\Facades\Validator;
77
use Illuminate\Support\ServiceProvider;
88
use Illuminate\Support\Str;
9+
use Milwad\LaravelValidate\Utils\CountryLandlineCallback;
910
use Milwad\LaravelValidate\Utils\CountryPhoneCallback;
1011

1112
class LaravelValidateServiceProvider extends ServiceProvider
@@ -65,6 +66,12 @@ public function boot(): void
6566
CountryPhoneCallback::addValidator($code, $country);
6667
}
6768

69+
$landlineCountries = config('laravel-validate.landline-country', []);
70+
71+
foreach ($landlineCountries as $code => $country) {
72+
CountryLandlineCallback::addValidator($code, $country);
73+
}
74+
6875
// Register rules in container
6976
if (config('laravel-validate.using_container', false)) {
7077
$rules = File::files(__DIR__.'/Rules');

src/Rules/ValidLandlineNumber.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Rules;
4+
5+
use Illuminate\Contracts\Validation\Rule;
6+
use Milwad\LaravelValidate\Utils\CountryLandlineCallback;
7+
8+
class ValidLandlineNumber implements Rule
9+
{
10+
public function __construct(protected ?string $code = null) {}
11+
12+
/**
13+
* Check phone number is valid.
14+
*/
15+
public function passes($attribute, $value): bool
16+
{
17+
if (is_string($this->code)) {
18+
$passes = CountryLandlineCallback::callLandlineValidator($this->code, $value);
19+
20+
return collect($passes)->some(fn ($passe) => $passe);
21+
}
22+
23+
return preg_match('/^(?:\+|00)(?:[1-9]\d{0,2})(?:[ .\-]?\(?\d+\)?)+$/', $value);
24+
}
25+
26+
/**
27+
* Get the validation error message.
28+
*/
29+
public function message(): string
30+
{
31+
return __('validate.landline-number');
32+
}
33+
}

src/Utils/CountryLandlineCallback.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils;
4+
5+
use Milwad\LaravelValidate\Utils\CountryLandlineValidator\CountryLandlineValidator;
6+
use RuntimeException;
7+
8+
class CountryLandlineCallback
9+
{
10+
/**
11+
* Country Validate classes.
12+
*/
13+
protected static array $validators = [];
14+
15+
/**
16+
* Add new country validator.
17+
*
18+
* @throws \Throwable
19+
*/
20+
public static function addValidator(string $code, string $validator): void
21+
{
22+
if (! new $validator instanceof CountryLandlineValidator) {
23+
throw new RuntimeException('The validator is not instance of CountryLandlineValidator');
24+
}
25+
26+
self::$validators[$code] = $validator;
27+
}
28+
29+
/**
30+
* Call country validate class.
31+
*/
32+
public static function callLandlineValidator(string $code, $value)
33+
{
34+
if (isset(self::$validators[$code])) {
35+
return (new self::$validators[$code])->validate($value);
36+
} else {
37+
throw new \BadMethodCallException("Validator method for '$code' does not exist.");
38+
}
39+
}
40+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;
4+
5+
class CMLandlineValidator implements CountryLandlineValidator
6+
{
7+
/**
8+
* Validate Cameroon landline numbers.
9+
*/
10+
public function validate($value): bool
11+
{
12+
return preg_match('/^(?:(?:\+237|00237)[\s-]?2\d{8}|2\d{8})$/', $value);
13+
}
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;
4+
5+
interface CountryLandlineValidator
6+
{
7+
public function validate($value): bool;
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;
4+
5+
class DELandlineValidator implements CountryLandlineValidator
6+
{
7+
/**
8+
* Validate Germany landline numbers.
9+
*/
10+
public function validate($value): bool
11+
{
12+
return preg_match('/^(?:(?:\+49|0049)[\s\-]?[2-9]\d{1,4}[\s\-]?\d{3,8}|0[2-9]\d{1,4}[\s\-]?\d{3,8})$/', $value);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;
4+
5+
class ENLandlineValidator implements CountryLandlineValidator
6+
{
7+
/**
8+
* Validate England landline numbers.
9+
*/
10+
public function validate($value): bool
11+
{
12+
return preg_match('/^(?:(?:\+44|0044)\s?(?:1\d{9}|2\d{9})|0(?:1\d{9}|2\d{9}))$/', $value);
13+
}
14+
}

0 commit comments

Comments
 (0)