diff --git a/README.md b/README.md
index bf60fb8..a8f7522 100644
--- a/README.md
+++ b/README.md
@@ -137,6 +137,7 @@ return [
| 38 | [ValidUsername](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-username.md) | Validate username for ex (milwad) |
| 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) |
| 40 | [ValidVatId](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-vatid.md) | Validate european VAT ID ex (EL123456789123) |
+| 41 | [ValidLandlineNumber](https://github.com/milwad-dev/laravel-validate/blob/1.x/docs/1.x/valid-landline-number.md) | Validate landline number |
diff --git a/config/laravel-validate.php b/config/laravel-validate.php
index 196f2cc..69f5796 100644
--- a/config/laravel-validate.php
+++ b/config/laravel-validate.php
@@ -19,6 +19,25 @@
use Milwad\LaravelValidate\Utils\CountryPhoneValidator\TRPhoneValidator;
use Milwad\LaravelValidate\Utils\CountryPhoneValidator\ZHPhoneValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\CMLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\DELandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ENLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ESLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\FRLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\GRLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\IDLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\INLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\IRLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ITLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\JALandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\KOLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\NELandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\RULandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\SALandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\SELandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\TRLandlineValidator;
+use \Milwad\LaravelValidate\Utils\CountryLandlineValidator\ZHLandlineValidator;
+
return [
/*
* Mapping of country codes to their respective phone number validator classes.
@@ -47,6 +66,33 @@
'ZH' => ZHPhoneValidator::class, // China
],
+ /*
+ * Mapping of country codes to their respective landline number validator classes.
+ * Each validator enforces country-specific landline number formatting and validation rules.
+ *
+ * You can add custom country landline validator.
+ */
+ 'landline-country' => [
+ 'CM' => CMLandlineValidator::class, // Cameroon
+ 'DE' => DELandlineValidator::class, // Germany
+ 'EN' => ENLandlineValidator::class, // England
+ 'ES' => ESLandlineValidator::class, // Spain
+ 'FR' => FRLandlineValidator::class, // France
+ 'GR' => GRLandlineValidator::class, // Greece
+ 'ID' => IDLandlineValidator::class, // Indonesia
+ 'IN' => INLandlineValidator::class, // India
+ 'IR' => IRLandlineValidator::class, // Iran
+ 'IT' => ITLandlineValidator::class, // Italy
+ 'JA' => JALandlineValidator::class, // Japan
+ 'KO' => KOLandlineValidator::class, // South Korea
+ 'NE' => NELandlineValidator::class, // Netherlands
+ 'RU' => RULandlineValidator::class, // Russia
+ 'SA' => SALandlineValidator::class, // Saudi Arabia
+ 'SE' => SELandlineValidator::class, // Sweden
+ 'TR' => TRLandlineValidator::class, // Turkey
+ 'ZH' => ZHLandlineValidator::class, // China
+ ],
+
/*
* If you want to use rules like 'required|ValidPhone' in your validations, you can change it to true.
*/
diff --git a/docs/1.x/valid-landline-number.md b/docs/1.x/valid-landline-number.md
new file mode 100644
index 0000000..e46f296
--- /dev/null
+++ b/docs/1.x/valid-landline-number.md
@@ -0,0 +1,48 @@
+## ValidLandlineNumber
+
+If you want to validate the landline number, you can use the `ValidLandlineNumber` rule:
+
+```php
+use Milwad\LaravelValidate\Rules\ValidLandlineNumber;
+
+return [
+ 'landline-number' => ['required', new ValidLandlineNumber()], // landline-number => +98212223343
+];
+```
+
+Also, `ValidLandlineNumber` can validate landline numbers with a specific country code:
+
+```php
+use Milwad\LaravelValidate\Rules\ValidLandlineNumber;
+use Milwad\LaravelValidate\Utils\Country;
+
+return [
+ 'landline-number' => ['required', new ValidLandlineNumber(Country::GERMANY)], // landline-number => +49301234567
+];
+```
+
+> **Note**
+> If you want to know which country's codes are supported by the `ValidLandlineNumber` Rule, you can search your country
+> on this [Countries Landline Number](#support-countries-landline-number) list.
+
+
+## Support Countries Landline Number
+
+- ✅ IRAN
+- ✅ ENGLAND
+- ✅ NIGER
+- ✅ SAUDI_ARABIA
+- ✅ GERMANY
+- ✅ GREECE
+- ✅ SPAIN
+- ✅ FRANCE
+- ✅ INDIA
+- ✅ INDONESIA
+- ✅ ITALY
+- ✅ JAPAN
+- ✅ KOREAN
+- ✅ RUSSIA
+- ✅ SWEDEN
+- ✅ TURKEY
+- ✅ CHINA
+- ✅ CAMEROON
diff --git a/src/LaravelValidateServiceProvider.php b/src/LaravelValidateServiceProvider.php
index 0c5d87f..569a86f 100644
--- a/src/LaravelValidateServiceProvider.php
+++ b/src/LaravelValidateServiceProvider.php
@@ -6,6 +6,7 @@
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
+use Milwad\LaravelValidate\Utils\CountryLandlineCallback;
use Milwad\LaravelValidate\Utils\CountryPhoneCallback;
class LaravelValidateServiceProvider extends ServiceProvider
@@ -65,6 +66,12 @@ public function boot(): void
CountryPhoneCallback::addValidator($code, $country);
}
+ $landlineCountries = config('laravel-validate.landline-country', []);
+
+ foreach ($landlineCountries as $code => $country) {
+ CountryLandlineCallback::addValidator($code, $country);
+ }
+
// Register rules in container
if (config('laravel-validate.using_container', false)) {
$rules = File::files(__DIR__.'/Rules');
diff --git a/src/Rules/ValidLandlineNumber.php b/src/Rules/ValidLandlineNumber.php
new file mode 100644
index 0000000..ca29a0a
--- /dev/null
+++ b/src/Rules/ValidLandlineNumber.php
@@ -0,0 +1,33 @@
+code)) {
+ $passes = CountryLandlineCallback::callLandlineValidator($this->code, $value);
+
+ return collect($passes)->some(fn ($passe) => $passe);
+ }
+
+ return preg_match('/^(?:\+|00)(?:[1-9]\d{0,2})(?:[ .\-]?\(?\d+\)?)+$/', $value);
+ }
+
+ /**
+ * Get the validation error message.
+ */
+ public function message(): string
+ {
+ return __('validate.landline-number');
+ }
+}
diff --git a/src/Utils/CountryLandlineCallback.php b/src/Utils/CountryLandlineCallback.php
new file mode 100644
index 0000000..a7c7292
--- /dev/null
+++ b/src/Utils/CountryLandlineCallback.php
@@ -0,0 +1,40 @@
+validate($value);
+ } else {
+ throw new \BadMethodCallException("Validator method for '$code' does not exist.");
+ }
+ }
+}
diff --git a/src/Utils/CountryLandlineValidator/CMLandlineValidator.php b/src/Utils/CountryLandlineValidator/CMLandlineValidator.php
new file mode 100644
index 0000000..4090d7c
--- /dev/null
+++ b/src/Utils/CountryLandlineValidator/CMLandlineValidator.php
@@ -0,0 +1,14 @@
+ ':attribute kein gültiger.',
'username' => ':attribute kein gültiger.',
'uuid' => ':attribute kein gültiger.',
+ 'landline-number' => ':attribute kein gültiger.',
];
diff --git a/src/lang/fa/validate.php b/src/lang/fa/validate.php
index 72975fb..c3f1810 100644
--- a/src/lang/fa/validate.php
+++ b/src/lang/fa/validate.php
@@ -40,4 +40,5 @@
'url' => 'مقدار :attribute صحیح نمی باشد.',
'username' => 'مقدار :attribute صحیح نمی باشد.',
'uuid' => 'مقدار :attribute صحیح نمی باشد.',
+ 'landline-number' => 'مقدار :attribute صحیح نمی باشد.',
];
diff --git a/tests/Rules/ValidLandlineNumberTest.php b/tests/Rules/ValidLandlineNumberTest.php
new file mode 100644
index 0000000..f73bc24
--- /dev/null
+++ b/tests/Rules/ValidLandlineNumberTest.php
@@ -0,0 +1,111 @@
+ [new ValidLandlineNumber],
+ 'landline_de' => [new ValidLandlineNumber(Country::GERMANY)],
+ ];
+ $data = [
+ 'landline_number' => '+98212223343',
+ 'landline_de' => '+49301234567',
+ ];
+ $passes = $this->app['validator']->make($data, $rules)->passes();
+
+ $this->assertTrue($passes);
+ }
+
+ /**
+ * Test landline number is not valid.
+ */
+ public function test_landline_number_is_not_valid()
+ {
+ $rules = [
+ 'landline_number' => [new ValidLandlineNumber],
+ 'landline_ir' => [new ValidLandlineNumber(Country::IRAN)],
+ ];
+ $data = [
+ 'landline_number' => '123456789',
+ 'landline_ir' => '09120000000',
+ ];
+ $passes = $this->app['validator']->make($data, $rules)->passes();
+
+ $this->assertFalse($passes);
+ }
+
+ /**
+ * Test all landline number is valid by specific code.
+ */
+ public function test_all_landline_number_is_valid_by_specific_code()
+ {
+ $rules = [
+ 'landline_ir' => [new ValidLandlineNumber(Country::IRAN)],
+ 'landline_en' => [new ValidLandlineNumber(Country::ENGLAND)],
+ 'landline_ne' => [new ValidLandlineNumber(Country::NIGER)],
+ 'landline_sa' => [new ValidLandlineNumber(Country::SAUDI_ARABIA)],
+ 'landline_de' => [new ValidLandlineNumber(Country::GERMANY)],
+ 'landline_gr' => [new ValidLandlineNumber(Country::GREECE)],
+ 'landline_es' => [new ValidLandlineNumber(Country::SPAIN)],
+ 'landline_fr' => [new ValidLandlineNumber(Country::FRANCE)],
+ 'landline_in' => [new ValidLandlineNumber(Country::INDIA)],
+ 'landline_id' => [new ValidLandlineNumber(Country::INDONESIA)],
+ 'landline_it' => [new ValidLandlineNumber(Country::ITALY)],
+ 'landline_ja' => [new ValidLandlineNumber(Country::JAPAN)],
+ 'landline_ko' => [new ValidLandlineNumber(Country::KOREAN)],
+ 'landline_ru' => [new ValidLandlineNumber(Country::RUSSIA)],
+ 'landline_se' => [new ValidLandlineNumber(Country::SWEDEN)],
+ 'landline_tr' => [new ValidLandlineNumber(Country::TURKEY)],
+ 'landline_ch' => [new ValidLandlineNumber(Country::CHINA)],
+ 'landline_cm' => [new ValidLandlineNumber(Country::CAMEROON)],
+ ];
+ $data = [
+ 'landline_ir' => '02155555555', // Iran - Tehran landline
+ 'landline_en' => '+442071234567', // UK - London landline
+ 'landline_ne' => '+22720301234', // Niger - Niamey landline
+ 'landline_sa' => '+966512345678', // Saudi Arabia - Riyadh landline
+ 'landline_de' => '+493012345678', // Germany - Berlin landline
+ 'landline_gr' => '+302112345678', // Greece - Athens landline
+ 'landline_es' => '+34912345678', // Spain - Madrid landline
+ 'landline_fr' => '+33123456789', // France - Paris landline
+ 'landline_in' => '+911123456789', // India - Delhi landline
+ 'landline_id' => '+62211234567', // Indonesia - Jakarta landline
+ 'landline_it' => '+390612345678', // Italy - Rome landline
+ 'landline_ja' => '+81312345678', // Japan - Tokyo landline
+ 'landline_ko' => '+82231234567', // South Korea - Seoul landline
+ 'landline_ru' => '+74951234567', // Russia - Moscow landline
+ 'landline_se' => '+46812345678', // Sweden - Stockholm landline
+ 'landline_tr' => '+902123456789', // Turkey - Istanbul landline
+ 'landline_ch' => '+861012345678', // China - Beijing landline
+ 'landline_cm' => '+237222123456', // Cameroon - Douala landline
+ ];
+ $passes = $this->app['validator']->make($data, $rules)->passes();
+
+ $this->assertTrue($passes);
+ }
+
+ /**
+ * Test if landline number validate method is not exists, will be thrown an exception.
+ */
+ public function test_if_landline_number_validate_method_is_not_exists()
+ {
+ $this->expectException(BadMethodCallException::class);
+ $this->expectExceptionMessage("Validator method for 'AZ' does not exist.");
+
+ $rules = ['landline' => [new ValidLandlineNumber(Country::AZERBAIJAN)]];
+ $data = ['landline' => '+62812345678'];
+
+ $this->app['validator']->make($data, $rules)->passes();
+ }
+}