Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
08a7990
Create CountryLandlineValidator interface
vahidkaargar Apr 17, 2025
d3847cb
Create CountryLandlineCallback class
vahidkaargar Apr 17, 2025
c7f4cfe
Create landline validator for germany
vahidkaargar Apr 17, 2025
5d7fd23
Create landline validator for Iran
vahidkaargar Apr 17, 2025
1178446
Create ValidLandlineNumber.php
vahidkaargar Apr 17, 2025
814e537
Add translation for landline validation
vahidkaargar Apr 17, 2025
c7f7dfe
Add landline validators to config
vahidkaargar Apr 17, 2025
ed58f14
Add landline validators on service provider
vahidkaargar Apr 17, 2025
db17be5
Create test for landline validator
vahidkaargar Apr 17, 2025
704fc4b
Create documentation for landline validator
vahidkaargar Apr 17, 2025
7615da2
Add landline validator documentation to readme.md
vahidkaargar Apr 17, 2025
c3eb085
Merge pull request #1 from vahidkaargar/dev
vahidkaargar Apr 17, 2025
954e02a
Support 18 countries for landline validation
vahidkaargar Apr 19, 2025
b4b6f19
Add countries to config for landline
vahidkaargar Apr 19, 2025
d22d121
Update documents for landline validation
vahidkaargar Apr 19, 2025
64c50ba
Merge pull request #2 from vahidkaargar/dev
vahidkaargar Apr 19, 2025
9356d91
Merge pull request #3 from vahidkaargar/dev
vahidkaargar Apr 19, 2025
c5a120d
Update valid-landline-number.md
milwad-dev Apr 19, 2025
a97df27
Fix validation for Saudi Arabia landline
vahidkaargar Apr 20, 2025
5dfd2ba
Write test for all validations
vahidkaargar Apr 20, 2025
fec3303
Merge pull request #4 from vahidkaargar/dev
vahidkaargar Apr 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

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

Expand Down
46 changes: 46 additions & 0 deletions config/laravel-validate.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
*/
Expand Down
48 changes: 48 additions & 0 deletions docs/1.x/valid-landline-number.md
Original file line number Diff line number Diff line change
@@ -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 => 09120000000
];
```

Also `ValidLandlineNumber` have the ability to validate landline number with specific country code:

```php
use Milwad\LaravelValidate\Rules\ValidLandlineNumber;
use Milwad\LaravelValidate\Utils\Country;

return [
'landline-number' => ['required', new ValidLandlineNumber(Country::GERMANY)], // landline-number => 09120000000
];
```

> **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.

<a name="support-countries-landline-number"></a>
## Support Countries Landline Number

- ✅ IRAN
- ✅ ENGLAND
- ✅ NIGER
- ✅ SAUDI_ARABIA
- ✅ GERMANY
- ✅ GREECE
- ✅ SPAIN
- ✅ FRANCE
- ✅ INDIA
- ✅ INDONESIA
- ✅ ITALY
- ✅ JAPAN
- ✅ KOREAN
- ✅ RUSSIA
- ✅ SWEDEN
- ✅ TURKEY
- ✅ CHINA
- ✅ CAMEROON
7 changes: 7 additions & 0 deletions src/LaravelValidateServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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');
Expand Down
33 changes: 33 additions & 0 deletions src/Rules/ValidLandlineNumber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace Milwad\LaravelValidate\Rules;

use Illuminate\Contracts\Validation\Rule;
use Milwad\LaravelValidate\Utils\CountryLandlineCallback;

class ValidLandlineNumber implements Rule
{
public function __construct(protected ?string $code = null) {}

/**
* Check phone number is valid.
*/
public function passes($attribute, $value): bool
{
if (is_string($this->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');
}
}
40 changes: 40 additions & 0 deletions src/Utils/CountryLandlineCallback.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Milwad\LaravelValidate\Utils;

use Milwad\LaravelValidate\Utils\CountryLandlineValidator\CountryLandlineValidator;
use RuntimeException;

class CountryLandlineCallback
{
/**
* Country Validate classes.
*/
protected static array $validators = [];

/**
* Add new country validator.
*
* @throws \Throwable
*/
public static function addValidator(string $code, string $validator): void
{
if (! new $validator instanceof CountryLandlineValidator) {
throw new RuntimeException('The validator is not instance of CountryLandlineValidator');
}

self::$validators[$code] = $validator;
}

/**
* Call country validate class.
*/
public static function callLandlineValidator(string $code, $value)
{
if (isset(self::$validators[$code])) {
return (new self::$validators[$code])->validate($value);
} else {
throw new \BadMethodCallException("Validator method for '$code' does not exist.");
}
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/CMLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class CMLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Cameroon landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+237|00237)[\s-]?2\d{8}|2\d{8})$/', $value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

interface CountryLandlineValidator
{
public function validate($value): bool;
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/DELandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class DELandlineValidator implements CountryLandlineValidator
{
/**
* Validate Germany landline numbers.
*/
public function validate($value): bool
{
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);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/ENLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class ENLandlineValidator implements CountryLandlineValidator
{
/**
* Validate England landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+44|0044)\s?(?:1\d{9}|2\d{9})|0(?:1\d{9}|2\d{9}))$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/ESLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class ESLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Spain landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+34|0034)?\s?[89]\d{8})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/FRLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class FRLandlineValidator implements CountryLandlineValidator
{
/**
* Validate France landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+33|0033)\s?[1-5]\d{8}|0[1-5]\d{8})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/GRLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class GRLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Greece landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+30|0030)\s?[2]\d{9}|0[2]\d{9})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/IDLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class IDLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Indonesia landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+62|0062)[\s\-]?21\d{7,8}|(?:\+62|0062)[\s\-]?[2-9]\d{1,3}\d{5,8}|0[2-9]\d{1,3}\d{5,8})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/INLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class INLandlineValidator implements CountryLandlineValidator
{
/**
* Validate India landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+91|0091)[\s\-]?0?[1-6]\d{1,4}\d{6,8}|0[1-6]\d{1,4}\d{6,8})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/IRLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class IRLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Iran landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:98|\+98|0098|0)?[1-8]{1}\d{9}$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/ITLandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class ITLandlineValidator implements CountryLandlineValidator
{
/**
* Validate Italy landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+39|0039)[\s\-]?0\d{5,10}|0\d{5,10})$/', $value);
}
}
14 changes: 14 additions & 0 deletions src/Utils/CountryLandlineValidator/JALandlineValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Milwad\LaravelValidate\Utils\CountryLandlineValidator;

class JALandlineValidator implements CountryLandlineValidator
{
/**
* Validate Japan landline numbers.
*/
public function validate($value): bool
{
return preg_match('/^(?:(?:\+81|0081)[\s\-]?0?[1-9]\d{1,3}\d{4,6}|0[1-9]\d{1,3}\d{4,6})$/', $value);
}
}
Loading