Completed
Pull Request — master (#76)
by
unknown
24:21
created
src/PhoneServiceProvider.php 1 patch
Indentation   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -10,63 +10,63 @@
 block discarded – undo
10 10
 
11 11
 class PhoneServiceProvider extends ServiceProvider
12 12
 {
13
-    /**
14
-     * Bootstrap the application events.
15
-     *
16
-     * @return void
17
-     */
18
-    public function boot()
19
-    {
20
-        $this->registerValidator();
13
+	/**
14
+	 * Bootstrap the application events.
15
+	 *
16
+	 * @return void
17
+	 */
18
+	public function boot()
19
+	{
20
+		$this->registerValidator();
21 21
 
22
-        $this->registerRule();
23
-    }
22
+		$this->registerRule();
23
+	}
24 24
 
25
-    /**
26
-     * Register the service provider.
27
-     *
28
-     * @return void
29
-     */
30
-    public function register()
31
-    {
32
-        $this->app->singleton('libphonenumber', function ($app) {
33
-            return PhoneNumberUtil::getInstance();
34
-        });
25
+	/**
26
+	 * Register the service provider.
27
+	 *
28
+	 * @return void
29
+	 */
30
+	public function register()
31
+	{
32
+		$this->app->singleton('libphonenumber', function ($app) {
33
+			return PhoneNumberUtil::getInstance();
34
+		});
35 35
 
36
-        $this->app->alias('libphonenumber', PhoneNumberUtil::class);
37
-    }
36
+		$this->app->alias('libphonenumber', PhoneNumberUtil::class);
37
+	}
38 38
 
39
-    /**
40
-     * Register the "phone" validator.
41
-     */
42
-    protected function registerValidator()
43
-    {
44
-        $extend = static::canUseDependentValidation() ? 'extendDependent' : 'extend';
39
+	/**
40
+	 * Register the "phone" validator.
41
+	 */
42
+	protected function registerValidator()
43
+	{
44
+		$extend = static::canUseDependentValidation() ? 'extendDependent' : 'extend';
45 45
 
46
-        $this->app['validator']->{$extend}('phone', Validation\Phone::class . '@validate');
47
-    }
46
+		$this->app['validator']->{$extend}('phone', Validation\Phone::class . '@validate');
47
+	}
48 48
 
49
-    /**
50
-     * Register the "phone" rule macro.
51
-     */
52
-    protected function registerRule()
53
-    {
54
-        if (class_exists('Illuminate\Validation\Rule') && class_uses(Rule::class, Macroable::class)) {
55
-            Rule::macro('phone', function () {
56
-                return new Rules\Phone;
57
-            });
58
-        }
59
-    }
49
+	/**
50
+	 * Register the "phone" rule macro.
51
+	 */
52
+	protected function registerRule()
53
+	{
54
+		if (class_exists('Illuminate\Validation\Rule') && class_uses(Rule::class, Macroable::class)) {
55
+			Rule::macro('phone', function () {
56
+				return new Rules\Phone;
57
+			});
58
+		}
59
+	}
60 60
 
61
-    /**
62
-     * Determine whether we can register a dependent validator.
63
-     *
64
-     * @return bool
65
-     */
66
-    public static function canUseDependentValidation()
67
-    {
68
-        $validator = new ReflectionClass('\Illuminate\Validation\Factory');
61
+	/**
62
+	 * Determine whether we can register a dependent validator.
63
+	 *
64
+	 * @return bool
65
+	 */
66
+	public static function canUseDependentValidation()
67
+	{
68
+		$validator = new ReflectionClass('\Illuminate\Validation\Factory');
69 69
 
70
-        return $validator->hasMethod('extendDependent');
71
-    }
70
+		return $validator->hasMethod('extendDependent');
71
+	}
72 72
 }
Please login to merge, or discard this patch.
src/Traits/ParsesCountries.php 1 patch
Indentation   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -5,31 +5,31 @@
 block discarded – undo
5 5
 
6 6
 trait ParsesCountries
7 7
 {
8
-    /**
9
-     * Determine whether the given country code is valid.
10
-     *
11
-     * @param string $country
12
-     * @return bool
13
-     */
14
-    public static function isValidCountryCode($country)
15
-    {
16
-        return ISO3166::isValid($country);
17
-    }
8
+	/**
9
+	 * Determine whether the given country code is valid.
10
+	 *
11
+	 * @param string $country
12
+	 * @return bool
13
+	 */
14
+	public static function isValidCountryCode($country)
15
+	{
16
+		return ISO3166::isValid($country);
17
+	}
18 18
 
19
-    /**
20
-     * Parse the provided phone countries to a valid array.
21
-     *
22
-     * @param string|array $countries
23
-     * @return array
24
-     */
25
-    protected function parseCountries($countries)
26
-    {
27
-        return Collection::make(is_array($countries) ? $countries : func_get_args())
28
-                         ->map(function ($country) {
29
-                             return strtoupper($country);
30
-                         })
31
-                         ->filter(function ($value) {
32
-                             return static::isValidCountryCode($value);
33
-                         })->toArray();
34
-    }
19
+	/**
20
+	 * Parse the provided phone countries to a valid array.
21
+	 *
22
+	 * @param string|array $countries
23
+	 * @return array
24
+	 */
25
+	protected function parseCountries($countries)
26
+	{
27
+		return Collection::make(is_array($countries) ? $countries : func_get_args())
28
+						 ->map(function ($country) {
29
+							 return strtoupper($country);
30
+						 })
31
+						 ->filter(function ($value) {
32
+							 return static::isValidCountryCode($value);
33
+						 })->toArray();
34
+	}
35 35
 }
36 36
\ No newline at end of file
Please login to merge, or discard this patch.
src/Traits/ParsesTypes.php 1 patch
Indentation   +63 added lines, -63 removed lines patch added patch discarded remove patch
@@ -7,74 +7,74 @@
 block discarded – undo
7 7
 
8 8
 trait ParsesTypes
9 9
 {
10
-    /**
11
-     * Array of available phone types.
12
-     *
13
-     * @var array
14
-     */
15
-    protected static $types;
10
+	/**
11
+	 * Array of available phone types.
12
+	 *
13
+	 * @var array
14
+	 */
15
+	protected static $types;
16 16
 
17
-    /**
18
-     * Determine whether the given type is valid.
19
-     *
20
-     * @param string $type
21
-     * @return bool
22
-     */
23
-    public static function isValidType($type)
24
-    {
25
-        return ! empty(static::parseTypes($type));
26
-    }
17
+	/**
18
+	 * Determine whether the given type is valid.
19
+	 *
20
+	 * @param string $type
21
+	 * @return bool
22
+	 */
23
+	public static function isValidType($type)
24
+	{
25
+		return ! empty(static::parseTypes($type));
26
+	}
27 27
 
28
-    /**
29
-     * Parse a phone type into constant's value.
30
-     *
31
-     * @param string|array $types
32
-     * @return array
33
-     */
34
-    protected static function parseTypes($types)
35
-    {
36
-        static::loadTypes();
28
+	/**
29
+	 * Parse a phone type into constant's value.
30
+	 *
31
+	 * @param string|array $types
32
+	 * @return array
33
+	 */
34
+	protected static function parseTypes($types)
35
+	{
36
+		static::loadTypes();
37 37
 
38
-        return Collection::make(is_array($types) ? $types : func_get_args())
39
-                         ->map(function ($type) {
40
-                             // If the type equals a constant's value, just return it.
41
-                             if (in_array($type, static::$types, true)) {
42
-                                 return $type;
43
-                             }
38
+		return Collection::make(is_array($types) ? $types : func_get_args())
39
+						 ->map(function ($type) {
40
+							 // If the type equals a constant's value, just return it.
41
+							 if (in_array($type, static::$types, true)) {
42
+								 return $type;
43
+							 }
44 44
 
45
-                             // Otherwise we'll assume the type is the constant's name.
46
-                             return Arr::get(static::$types, strtoupper($type));
47
-                         })
48
-                         ->reject(function ($value) {
49
-                             return is_null($value) || $value === false;
50
-                         })->toArray();
51
-    }
45
+							 // Otherwise we'll assume the type is the constant's name.
46
+							 return Arr::get(static::$types, strtoupper($type));
47
+						 })
48
+						 ->reject(function ($value) {
49
+							 return is_null($value) || $value === false;
50
+						 })->toArray();
51
+	}
52 52
 
53
-    /**
54
-     * Parse a phone type into its string representation.
55
-     *
56
-     * @param string|array $types
57
-     * @return array
58
-     */
59
-    protected static function parseTypesAsStrings($types)
60
-    {
61
-        static::loadTypes();
53
+	/**
54
+	 * Parse a phone type into its string representation.
55
+	 *
56
+	 * @param string|array $types
57
+	 * @return array
58
+	 */
59
+	protected static function parseTypesAsStrings($types)
60
+	{
61
+		static::loadTypes();
62 62
 
63
-        return array_keys(
64
-            array_intersect(
65
-                static::$types,
66
-                static::parseTypes($types)
67
-            )
68
-        );
69
-    }
63
+		return array_keys(
64
+			array_intersect(
65
+				static::$types,
66
+				static::parseTypes($types)
67
+			)
68
+		);
69
+	}
70 70
 
71
-    /**
72
-     * Load all available formats once.
73
-     */
74
-    private static function loadTypes()
75
-    {
76
-        if (! static::$types) {
77
-            static::$types = with(new ReflectionClass(PhoneNumberType::class))->getConstants();
78
-        }
79
-    }
71
+	/**
72
+	 * Load all available formats once.
73
+	 */
74
+	private static function loadTypes()
75
+	{
76
+		if (! static::$types) {
77
+			static::$types = with(new ReflectionClass(PhoneNumberType::class))->getConstants();
78
+		}
79
+	}
80 80
 }
81 81
\ No newline at end of file
Please login to merge, or discard this patch.
src/Traits/ParsesFormats.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -6,50 +6,50 @@
 block discarded – undo
6 6
 
7 7
 trait ParsesFormats
8 8
 {
9
-    /**
10
-     * Array of available phone formats.
11
-     *
12
-     * @var array
13
-     */
14
-    protected static $formats;
9
+	/**
10
+	 * Array of available phone formats.
11
+	 *
12
+	 * @var array
13
+	 */
14
+	protected static $formats;
15 15
 
16
-    /**
17
-     * Determine whether the given format is valid.
18
-     *
19
-     * @param string $format
20
-     * @return bool
21
-     */
22
-    public static function isValidFormat($format)
23
-    {
24
-        return ! is_null(static::parseFormat($format));
25
-    }
16
+	/**
17
+	 * Determine whether the given format is valid.
18
+	 *
19
+	 * @param string $format
20
+	 * @return bool
21
+	 */
22
+	public static function isValidFormat($format)
23
+	{
24
+		return ! is_null(static::parseFormat($format));
25
+	}
26 26
 
27
-    /**
28
-     * Parse a phone format.
29
-     *
30
-     * @param string $format
31
-     * @return string
32
-     */
33
-    protected static function parseFormat($format)
34
-    {
35
-        static::loadFormats();
27
+	/**
28
+	 * Parse a phone format.
29
+	 *
30
+	 * @param string $format
31
+	 * @return string
32
+	 */
33
+	protected static function parseFormat($format)
34
+	{
35
+		static::loadFormats();
36 36
 
37
-        // If the format equals a constant's value, just return it.
38
-        if (in_array($format, static::$formats, true)) {
39
-            return $format;
40
-        }
37
+		// If the format equals a constant's value, just return it.
38
+		if (in_array($format, static::$formats, true)) {
39
+			return $format;
40
+		}
41 41
 
42
-        // Otherwise we'll assume the format is the constant's name.
43
-        return Arr::get(static::$formats, strtoupper($format));
44
-    }
42
+		// Otherwise we'll assume the format is the constant's name.
43
+		return Arr::get(static::$formats, strtoupper($format));
44
+	}
45 45
 
46
-    /**
47
-     * Load all available formats once.
48
-     */
49
-    private static function loadFormats()
50
-    {
51
-        if (! static::$formats) {
52
-            static::$formats = with(new ReflectionClass(PhoneNumberFormat::class))->getConstants();
53
-        }
54
-    }
46
+	/**
47
+	 * Load all available formats once.
48
+	 */
49
+	private static function loadFormats()
50
+	{
51
+		if (! static::$formats) {
52
+			static::$formats = with(new ReflectionClass(PhoneNumberFormat::class))->getConstants();
53
+		}
54
+	}
55 55
 }
56 56
\ No newline at end of file
Please login to merge, or discard this patch.
src/helpers.php 1 patch
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -3,22 +3,22 @@
 block discarded – undo
3 3
 use Propaganistas\LaravelPhone\PhoneNumber;
4 4
 
5 5
 if (! function_exists('phone')) {
6
-    /**
7
-     * Get a PhoneNumber instance or a formatted string.
8
-     *
9
-     * @param string       $number
10
-     * @param string|array $country
11
-     * @param string       $format
12
-     * @return string|Propaganistas\LaravelPhone\PhoneNumber
13
-     */
14
-    function phone($number, $country = [], $format = null)
15
-    {
16
-        $phone = PhoneNumber::make($number, $country);
6
+	/**
7
+	 * Get a PhoneNumber instance or a formatted string.
8
+	 *
9
+	 * @param string       $number
10
+	 * @param string|array $country
11
+	 * @param string       $format
12
+	 * @return string|Propaganistas\LaravelPhone\PhoneNumber
13
+	 */
14
+	function phone($number, $country = [], $format = null)
15
+	{
16
+		$phone = PhoneNumber::make($number, $country);
17 17
 
18
-        if (! is_null($format)) {
19
-            return $phone->format($format);
20
-        }
18
+		if (! is_null($format)) {
19
+			return $phone->format($format);
20
+		}
21 21
 
22
-        return $phone;
23
-    }
22
+		return $phone;
23
+	}
24 24
 }
Please login to merge, or discard this patch.
src/Rules/Phone.php 1 patch
Indentation   +143 added lines, -143 removed lines patch added patch discarded remove patch
@@ -6,147 +6,147 @@
 block discarded – undo
6 6
 
7 7
 class Phone
8 8
 {
9
-    /**
10
-     * The provided phone countries.
11
-     *
12
-     * @var array
13
-     */
14
-    protected $countries = [];
15
-
16
-    /**
17
-     * The input field name to check for a country value.
18
-     *
19
-     * @var string
20
-     */
21
-    protected $countryField;
22
-
23
-    /**
24
-     * The provided phone types.
25
-     *
26
-     * @var array
27
-     */
28
-    protected $types = [];
29
-
30
-    /**
31
-     * Whether the number's country should be auto-detected.
32
-     *
33
-     * @var bool
34
-     */
35
-    protected $detect = false;
36
-
37
-    /**
38
-     * Whether to allow lenient checks (i.e. landline numbers without area codes).
39
-     *
40
-     * @var bool
41
-     */
42
-    protected $lenient = false;
43
-
44
-    /**
45
-     * Set the phone countries.
46
-     *
47
-     * @param string|array $country
48
-     * @return $this
49
-     */
50
-    public function country($country)
51
-    {
52
-        $countries = is_array($country) ? $country : func_get_args();
53
-
54
-        $this->countries = array_merge($this->countries, $countries);
55
-
56
-        return $this;
57
-    }
58
-
59
-    /**
60
-     * Set the country input field.
61
-     *
62
-     * @param string $name
63
-     * @return $this
64
-     */
65
-    public function countryField($name)
66
-    {
67
-        $this->countryField = $name;
68
-
69
-        return $this;
70
-    }
71
-
72
-    /**
73
-     * Set the phone types.
74
-     *
75
-     * @param string|array $type
76
-     * @return $this
77
-     */
78
-    public function type($type)
79
-    {
80
-        $types = is_array($type) ? $type : func_get_args();
81
-
82
-        $this->types = array_merge($this->types, $types);
83
-
84
-        return $this;
85
-    }
86
-
87
-    /**
88
-     * Shortcut method for mobile type restriction.
89
-     *
90
-     * @return $this
91
-     */
92
-    public function mobile()
93
-    {
94
-        $this->type(PhoneNumberType::MOBILE);
95
-
96
-        return $this;
97
-    }
98
-
99
-    /**
100
-     * Shortcut method for fixed line type restriction.
101
-     *
102
-     * @return $this
103
-     */
104
-    public function fixedLine()
105
-    {
106
-        $this->type(PhoneNumberType::FIXED_LINE);
107
-
108
-        return $this;
109
-    }
110
-
111
-    /**
112
-     * Enable automatic country detection.
113
-     *
114
-     * @return $this
115
-     */
116
-    public function detect()
117
-    {
118
-        $this->detect = true;
119
-
120
-        return $this;
121
-    }
122
-
123
-    /**
124
-     * Enable lenient number checking.
125
-     *
126
-     * @return $this
127
-     */
128
-    public function lenient()
129
-    {
130
-        $this->lenient = true;
131
-
132
-        return $this;
133
-    }
134
-
135
-    /**
136
-     * Convert the rule to a validation string.
137
-     *
138
-     * @return string
139
-     */
140
-    public function __toString()
141
-    {
142
-        $parameters = implode(',', array_merge(
143
-            $this->countries,
144
-            $this->types,
145
-            ($this->countryField ? [$this->countryField]: []),
146
-            ($this->detect ? ['AUTO'] : []),
147
-            ($this->lenient ? ['LENIENT'] : [])
148
-        ));
149
-
150
-        return 'phone' . (! empty($parameters) ? ":$parameters" : '');
151
-    }
9
+	/**
10
+	 * The provided phone countries.
11
+	 *
12
+	 * @var array
13
+	 */
14
+	protected $countries = [];
15
+
16
+	/**
17
+	 * The input field name to check for a country value.
18
+	 *
19
+	 * @var string
20
+	 */
21
+	protected $countryField;
22
+
23
+	/**
24
+	 * The provided phone types.
25
+	 *
26
+	 * @var array
27
+	 */
28
+	protected $types = [];
29
+
30
+	/**
31
+	 * Whether the number's country should be auto-detected.
32
+	 *
33
+	 * @var bool
34
+	 */
35
+	protected $detect = false;
36
+
37
+	/**
38
+	 * Whether to allow lenient checks (i.e. landline numbers without area codes).
39
+	 *
40
+	 * @var bool
41
+	 */
42
+	protected $lenient = false;
43
+
44
+	/**
45
+	 * Set the phone countries.
46
+	 *
47
+	 * @param string|array $country
48
+	 * @return $this
49
+	 */
50
+	public function country($country)
51
+	{
52
+		$countries = is_array($country) ? $country : func_get_args();
53
+
54
+		$this->countries = array_merge($this->countries, $countries);
55
+
56
+		return $this;
57
+	}
58
+
59
+	/**
60
+	 * Set the country input field.
61
+	 *
62
+	 * @param string $name
63
+	 * @return $this
64
+	 */
65
+	public function countryField($name)
66
+	{
67
+		$this->countryField = $name;
68
+
69
+		return $this;
70
+	}
71
+
72
+	/**
73
+	 * Set the phone types.
74
+	 *
75
+	 * @param string|array $type
76
+	 * @return $this
77
+	 */
78
+	public function type($type)
79
+	{
80
+		$types = is_array($type) ? $type : func_get_args();
81
+
82
+		$this->types = array_merge($this->types, $types);
83
+
84
+		return $this;
85
+	}
86
+
87
+	/**
88
+	 * Shortcut method for mobile type restriction.
89
+	 *
90
+	 * @return $this
91
+	 */
92
+	public function mobile()
93
+	{
94
+		$this->type(PhoneNumberType::MOBILE);
95
+
96
+		return $this;
97
+	}
98
+
99
+	/**
100
+	 * Shortcut method for fixed line type restriction.
101
+	 *
102
+	 * @return $this
103
+	 */
104
+	public function fixedLine()
105
+	{
106
+		$this->type(PhoneNumberType::FIXED_LINE);
107
+
108
+		return $this;
109
+	}
110
+
111
+	/**
112
+	 * Enable automatic country detection.
113
+	 *
114
+	 * @return $this
115
+	 */
116
+	public function detect()
117
+	{
118
+		$this->detect = true;
119
+
120
+		return $this;
121
+	}
122
+
123
+	/**
124
+	 * Enable lenient number checking.
125
+	 *
126
+	 * @return $this
127
+	 */
128
+	public function lenient()
129
+	{
130
+		$this->lenient = true;
131
+
132
+		return $this;
133
+	}
134
+
135
+	/**
136
+	 * Convert the rule to a validation string.
137
+	 *
138
+	 * @return string
139
+	 */
140
+	public function __toString()
141
+	{
142
+		$parameters = implode(',', array_merge(
143
+			$this->countries,
144
+			$this->types,
145
+			($this->countryField ? [$this->countryField]: []),
146
+			($this->detect ? ['AUTO'] : []),
147
+			($this->lenient ? ['LENIENT'] : [])
148
+		));
149
+
150
+		return 'phone' . (! empty($parameters) ? ":$parameters" : '');
151
+	}
152 152
 }
153 153
\ No newline at end of file
Please login to merge, or discard this patch.
src/Validation/Phone.php 1 patch
Indentation   +126 added lines, -126 removed lines patch added patch discarded remove patch
@@ -11,130 +11,130 @@
 block discarded – undo
11 11
 
12 12
 class Phone
13 13
 {
14
-    use ParsesCountries,
15
-        ParsesTypes;
16
-
17
-    /**
18
-     * @var \libphonenumber\PhoneNumberUtil
19
-     */
20
-    protected $lib;
21
-
22
-    /**
23
-     * Phone constructor.
24
-     */
25
-    public function __construct()
26
-    {
27
-        $this->lib = PhoneNumberUtil::getInstance();
28
-    }
29
-
30
-    /**
31
-     * Validates a phone number.
32
-     *
33
-     * @param  string $attribute
34
-     * @param  mixed  $value
35
-     * @param  array  $parameters
36
-     * @param  object $validator
37
-     * @return bool
38
-     */
39
-    public function validate($attribute, $value, array $parameters, $validator)
40
-    {
41
-        $data = $validator->getData();
42
-
43
-        list(
44
-            $countries,
45
-            $types,
46
-            $detect,
47
-            $lenient) = $this->extractParameters($attribute, $parameters, $data);
48
-
49
-        // A "null" country is prepended:
50
-        // 1. In case of auto-detection to have the validation run first without supplying a country.
51
-        // 2. In case of lenient validation without provided countries; we still might have some luck...
52
-        if ($detect || ($lenient && empty($countries))) {
53
-            array_unshift($countries, null);
54
-        }
55
-
56
-        foreach ($countries as $country) {
57
-            try {
58
-                // Parsing the phone number also validates the country, so no need to do this explicitly.
59
-                // It'll throw a PhoneCountryException upon failure.
60
-                $phoneNumber = PhoneNumber::make($value, $country);
61
-
62
-                // Type validation.
63
-                if (! empty($types) && ! $phoneNumber->isOfType($types)) {
64
-                    continue;
65
-                }
66
-
67
-                $lenientPhoneNumber = $phoneNumber->lenient()->getPhoneNumberInstance();
68
-
69
-                // Lenient validation.
70
-                if ($lenient && $this->lib->isPossibleNumber($lenientPhoneNumber, $country)) {
71
-                    return true;
72
-                }
73
-
74
-                $phoneNumberInstance = $phoneNumber->getPhoneNumberInstance();
75
-
76
-                // Country detection.
77
-                if ($detect && $this->lib->isValidNumber($phoneNumberInstance)) {
78
-                    return true;
79
-                }
80
-
81
-                // Default number+country validation.
82
-                if ($this->lib->isValidNumberForRegion($phoneNumberInstance, $country)) {
83
-                    return true;
84
-                }
85
-            } catch (NumberParseException $e) {
86
-                continue;
87
-            }
88
-        }
89
-
90
-        return false;
91
-    }
92
-
93
-    /**
94
-     * Parse and extract parameters in the appropriate validation arguments.
95
-     *
96
-     * @param string $attribute
97
-     * @param array  $parameters
98
-     * @param array  $data
99
-     * @return array
100
-     * @throws \Propaganistas\LaravelPhone\Exceptions\InvalidParameterException
101
-     */
102
-    protected function extractParameters($attribute, array $parameters, array $data)
103
-    {
104
-        // Discover if an input field was provided. If not, guess the field's name.
105
-        $inputField = Collection::make($parameters)
106
-                                ->intersect(array_keys(Arr::dot($data)))
107
-                                ->first() ?: "${attribute}_country";
108
-
109
-        // Attempt to retrieve the field's value.
110
-        if ($inputCountry = Arr::get($data, $inputField)) {
111
-
112
-            if (static::isValidType($inputField)) {
113
-                throw InvalidParameterException::ambiguous($inputField);
114
-            }
115
-
116
-            $parameters[] = $inputCountry;
117
-        }
118
-
119
-        $countries = static::parseCountries($parameters);
120
-        $types = static::parseTypes($parameters);
121
-
122
-        // Force developers to write proper code.
123
-        // Since the static parsers return a validated array with preserved keys, we can safely diff against the keys.
124
-        // Unfortunately we can't use $collection->diffKeys() as it's not available yet in earlier 5.* versions.
125
-        $leftovers = array_diff_key($parameters, $types, $countries);
126
-        $leftovers = array_diff($leftovers, ['AUTO', 'LENIENT', $inputField]);
127
-
128
-        if (! empty($leftovers)) {
129
-            throw InvalidParameterException::parameters($leftovers);
130
-        }
131
-
132
-        return [
133
-            $countries,
134
-            $types,
135
-            in_array('AUTO', $parameters),
136
-            in_array('LENIENT', $parameters),
137
-            $inputField,
138
-        ];
139
-    }
14
+	use ParsesCountries,
15
+		ParsesTypes;
16
+
17
+	/**
18
+	 * @var \libphonenumber\PhoneNumberUtil
19
+	 */
20
+	protected $lib;
21
+
22
+	/**
23
+	 * Phone constructor.
24
+	 */
25
+	public function __construct()
26
+	{
27
+		$this->lib = PhoneNumberUtil::getInstance();
28
+	}
29
+
30
+	/**
31
+	 * Validates a phone number.
32
+	 *
33
+	 * @param  string $attribute
34
+	 * @param  mixed  $value
35
+	 * @param  array  $parameters
36
+	 * @param  object $validator
37
+	 * @return bool
38
+	 */
39
+	public function validate($attribute, $value, array $parameters, $validator)
40
+	{
41
+		$data = $validator->getData();
42
+
43
+		list(
44
+			$countries,
45
+			$types,
46
+			$detect,
47
+			$lenient) = $this->extractParameters($attribute, $parameters, $data);
48
+
49
+		// A "null" country is prepended:
50
+		// 1. In case of auto-detection to have the validation run first without supplying a country.
51
+		// 2. In case of lenient validation without provided countries; we still might have some luck...
52
+		if ($detect || ($lenient && empty($countries))) {
53
+			array_unshift($countries, null);
54
+		}
55
+
56
+		foreach ($countries as $country) {
57
+			try {
58
+				// Parsing the phone number also validates the country, so no need to do this explicitly.
59
+				// It'll throw a PhoneCountryException upon failure.
60
+				$phoneNumber = PhoneNumber::make($value, $country);
61
+
62
+				// Type validation.
63
+				if (! empty($types) && ! $phoneNumber->isOfType($types)) {
64
+					continue;
65
+				}
66
+
67
+				$lenientPhoneNumber = $phoneNumber->lenient()->getPhoneNumberInstance();
68
+
69
+				// Lenient validation.
70
+				if ($lenient && $this->lib->isPossibleNumber($lenientPhoneNumber, $country)) {
71
+					return true;
72
+				}
73
+
74
+				$phoneNumberInstance = $phoneNumber->getPhoneNumberInstance();
75
+
76
+				// Country detection.
77
+				if ($detect && $this->lib->isValidNumber($phoneNumberInstance)) {
78
+					return true;
79
+				}
80
+
81
+				// Default number+country validation.
82
+				if ($this->lib->isValidNumberForRegion($phoneNumberInstance, $country)) {
83
+					return true;
84
+				}
85
+			} catch (NumberParseException $e) {
86
+				continue;
87
+			}
88
+		}
89
+
90
+		return false;
91
+	}
92
+
93
+	/**
94
+	 * Parse and extract parameters in the appropriate validation arguments.
95
+	 *
96
+	 * @param string $attribute
97
+	 * @param array  $parameters
98
+	 * @param array  $data
99
+	 * @return array
100
+	 * @throws \Propaganistas\LaravelPhone\Exceptions\InvalidParameterException
101
+	 */
102
+	protected function extractParameters($attribute, array $parameters, array $data)
103
+	{
104
+		// Discover if an input field was provided. If not, guess the field's name.
105
+		$inputField = Collection::make($parameters)
106
+								->intersect(array_keys(Arr::dot($data)))
107
+								->first() ?: "${attribute}_country";
108
+
109
+		// Attempt to retrieve the field's value.
110
+		if ($inputCountry = Arr::get($data, $inputField)) {
111
+
112
+			if (static::isValidType($inputField)) {
113
+				throw InvalidParameterException::ambiguous($inputField);
114
+			}
115
+
116
+			$parameters[] = $inputCountry;
117
+		}
118
+
119
+		$countries = static::parseCountries($parameters);
120
+		$types = static::parseTypes($parameters);
121
+
122
+		// Force developers to write proper code.
123
+		// Since the static parsers return a validated array with preserved keys, we can safely diff against the keys.
124
+		// Unfortunately we can't use $collection->diffKeys() as it's not available yet in earlier 5.* versions.
125
+		$leftovers = array_diff_key($parameters, $types, $countries);
126
+		$leftovers = array_diff($leftovers, ['AUTO', 'LENIENT', $inputField]);
127
+
128
+		if (! empty($leftovers)) {
129
+			throw InvalidParameterException::parameters($leftovers);
130
+		}
131
+
132
+		return [
133
+			$countries,
134
+			$types,
135
+			in_array('AUTO', $parameters),
136
+			in_array('LENIENT', $parameters),
137
+			$inputField,
138
+		];
139
+	}
140 140
 }
Please login to merge, or discard this patch.
src/PhoneNumber.php 1 patch
Indentation   +369 added lines, -369 removed lines patch added patch discarded remove patch
@@ -18,373 +18,373 @@
 block discarded – undo
18 18
 
19 19
 class PhoneNumber implements Jsonable, JsonSerializable, Serializable
20 20
 {
21
-    use ParsesCountries,
22
-        ParsesFormats,
23
-        ParsesTypes;
24
-
25
-    /**
26
-     * The provided phone number.
27
-     *
28
-     * @var string
29
-     */
30
-    protected $number;
31
-
32
-    /**
33
-     * The provided phone country.
34
-     *
35
-     * @var array
36
-     */
37
-    protected $countries = [];
38
-
39
-    /**
40
-     * The detected phone country.
41
-     *
42
-     * @var string
43
-     */
44
-    protected $country;
45
-
46
-    /**
47
-     * Whether to allow lenient checks (i.e. landline numbers without area codes).
48
-     *
49
-     * @var bool
50
-     */
51
-    protected $lenient = false;
52
-
53
-    /**
54
-     * @var \libphonenumber\PhoneNumberUtil
55
-     */
56
-    protected $lib;
57
-
58
-    /**
59
-     * Phone constructor.
60
-     *
61
-     * @param string $number
62
-     */
63
-    public function __construct($number)
64
-    {
65
-        $this->number = $number;
66
-        $this->lib = PhoneNumberUtil::getInstance();
67
-    }
68
-
69
-    /**
70
-     * Create a phone instance.
71
-     *
72
-     * @param string       $number
73
-     * @param string|array $country
74
-     * @return static
75
-     */
76
-    public static function make($number, $country = [])
77
-    {
78
-        $instance = new static($number);
79
-
80
-        return $instance->ofCountry($country);
81
-    }
82
-
83
-    /**
84
-     * Set the country to which the phone number belongs to.
85
-     *
86
-     * @param string|array $country
87
-     * @return static
88
-     */
89
-    public function ofCountry($country)
90
-    {
91
-        $countries = is_array($country) ? $country : func_get_args();
92
-
93
-        $instance = clone $this;
94
-        $instance->countries = array_unique(
95
-            array_merge($instance->countries, static::parseCountries($countries))
96
-        );
97
-
98
-        return $instance;
99
-    }
100
-
101
-    /**
102
-     * Format the phone number in international format.
103
-     *
104
-     * @return string
105
-     */
106
-    public function formatInternational()
107
-    {
108
-        return $this->format(PhoneNumberFormat::INTERNATIONAL);
109
-    }
110
-
111
-    /**
112
-     * Format the phone number in national format.
113
-     *
114
-     * @return string
115
-     */
116
-    public function formatNational()
117
-    {
118
-        return $this->format(PhoneNumberFormat::NATIONAL);
119
-    }
120
-
121
-    /**
122
-     * Format the phone number in E164 format.
123
-     *
124
-     * @return string
125
-     */
126
-    public function formatE164()
127
-    {
128
-        return $this->format(PhoneNumberFormat::E164);
129
-    }
130
-
131
-    /**
132
-     * Format the phone number in RFC3966 format.
133
-     *
134
-     * @return string
135
-     */
136
-    public function formatRFC3966()
137
-    {
138
-        return $this->format(PhoneNumberFormat::RFC3966);
139
-    }
140
-
141
-    /**
142
-     * Format the phone number in a given format.
143
-     *
144
-     * @param string $format
145
-     * @return string
146
-     * @throws \Propaganistas\LaravelPhone\Exceptions\NumberFormatException
147
-     */
148
-    public function format($format)
149
-    {
150
-        $parsedFormat = static::parseFormat($format);
151
-
152
-        if (is_null($parsedFormat)) {
153
-            throw NumberFormatException::invalid($format);
154
-        }
155
-
156
-        return $this->lib->format(
157
-            $this->getPhoneNumberInstance(),
158
-            $parsedFormat
159
-        );
160
-    }
161
-
162
-    /**
163
-     * Format the phone number in a way that it can be dialled from the provided country.
164
-     *
165
-     * @param string $country
166
-     * @return string
167
-     * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException
168
-     */
169
-    public function formatForCountry($country)
170
-    {
171
-        if (! static::isValidCountryCode($country)) {
172
-            throw CountryCodeException::invalid($country);
173
-        }
174
-
175
-        return $this->lib->formatOutOfCountryCallingNumber(
176
-            $this->getPhoneNumberInstance(),
177
-            $country
178
-        );
179
-    }
180
-
181
-    /**
182
-     * Format the phone number in a way that it can be dialled from the provided country using a cellphone.
183
-     *
184
-     * @param string $country
185
-     * @param bool   $removeFormatting
186
-     * @return string
187
-     * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException
188
-     */
189
-    public function formatForMobileDialingInCountry($country, $removeFormatting = false)
190
-    {
191
-        if (! static::isValidCountryCode($country)) {
192
-            throw CountryCodeException::invalid($country);
193
-        }
194
-
195
-        return $this->lib->formatNumberForMobileDialing(
196
-            $this->getPhoneNumberInstance(),
197
-            $country,
198
-            $removeFormatting
199
-        );
200
-    }
201
-
202
-    /**
203
-     * Get the phone number's country.
204
-     *
205
-     * @return string
206
-     */
207
-    public function getCountry()
208
-    {
209
-        if (! $this->country) {
210
-            $this->country = $this->filterValidCountry($this->countries);
211
-        }
212
-
213
-        return $this->country;
214
-    }
215
-
216
-    /**
217
-     * Check if the phone number is of (a) given country(ies).
218
-     *
219
-     * @param string|array $country
220
-     * @return bool
221
-     */
222
-    public function isOfCountry($country)
223
-    {
224
-        $countries = static::parseCountries($country);
225
-
226
-        return in_array($this->getCountry(), $countries);
227
-    }
228
-
229
-    /**
230
-     * Filter the provided countries to the one that is valid for the number.
231
-     *
232
-     * @param string|array $countries
233
-     * @return string
234
-     * @throws \Propaganistas\LaravelPhone\Exceptions\NumberParseException
235
-     */
236
-    protected function filterValidCountry($countries)
237
-    {
238
-        $result = Collection::make($countries)
239
-                            ->filter(function ($country) {
240
-                                $instance = $this->lib->parse($this->number, $country);
241
-
242
-                                return $this->lenient
243
-                                    ? $this->lib->isPossibleNumber($instance, $country)
244
-                                    : $this->lib->isValidNumberForRegion($instance, $country);
245
-                            })->first();
246
-
247
-        // If we got a new result, return it.
248
-        if ($result) {
249
-            return $result;
250
-        }
251
-
252
-        // Last resort: try to detect it from an international number.
253
-        if ($this->numberLooksInternational()) {
254
-            $countries[] = null;
255
-        }
256
-
257
-        foreach ($countries as $country) {
258
-            $instance = $this->lib->parse($this->number, $country);
259
-
260
-            if ($this->lib->isValidNumber($instance)) {
261
-                return $this->lib->getRegionCodeForNumber($instance);
262
-            }
263
-        }
264
-
265
-        throw NumberParseException::countryRequired($this->number);
266
-    }
267
-
268
-    /**
269
-     * Get the phone number's type.
270
-     *
271
-     * @param bool $asConstant
272
-     * @return string|int|null
273
-     */
274
-    public function getType($asConstant = false)
275
-    {
276
-        $type = $this->lib->getNumberType($this->getPhoneNumberInstance());
277
-
278
-        if ($asConstant) {
279
-            return $type;
280
-        }
281
-
282
-        $stringType = Arr::get(static::parseTypesAsStrings($type), 0);
283
-
284
-        return $stringType ? strtolower($stringType) : null;
285
-    }
286
-
287
-    /**
288
-     * Check if the phone number is of (a) given type(s).
289
-     *
290
-     * @param string $type
291
-     * @return bool
292
-     */
293
-    public function isOfType($type)
294
-    {
295
-        $types = static::parseTypes($type);
296
-
297
-        return in_array($this->getType(true), $types, true);
298
-    }
299
-
300
-    /**
301
-     * Get the PhoneNumber instance of the current number.
302
-     *
303
-     * @return \libphonenumber\PhoneNumber
304
-     */
305
-    public function getPhoneNumberInstance()
306
-    {
307
-        return $this->lib->parse($this->number, $this->getCountry());
308
-    }
309
-
310
-    /**
311
-     * Determine whether the phone number seems to be in international format.
312
-     *
313
-     * @return bool
314
-     */
315
-    protected function numberLooksInternational()
316
-    {
317
-        return Str::startsWith($this->number, '+');
318
-    }
319
-
320
-    /**
321
-     * Enable lenient number parsing.
322
-     *
323
-     * @return $this
324
-     */
325
-    public function lenient()
326
-    {
327
-        $this->lenient = true;
328
-
329
-        return $this;
330
-    }
331
-
332
-    /**
333
-     * Convert the phone instance to JSON.
334
-     *
335
-     * @param  int $options
336
-     * @return string
337
-     */
338
-    public function toJson($options = 0)
339
-    {
340
-        return json_encode($this->jsonSerialize(), $options);
341
-    }
342
-
343
-    /**
344
-     * Convert the phone instance into something JSON serializable.
345
-     *
346
-     * @return string
347
-     */
348
-    public function jsonSerialize()
349
-    {
350
-        return $this->formatE164();
351
-    }
352
-
353
-    /**
354
-     * Convert the phone instance into a string representation.
355
-     *
356
-     * @return string
357
-     */
358
-    public function serialize()
359
-    {
360
-        return $this->formatE164();
361
-    }
362
-
363
-    /**
364
-     * Reconstructs the phone instance from a string representation.
365
-     *
366
-     * @param string $serialized
367
-     */
368
-    public function unserialize($serialized)
369
-    {
370
-        $this->lib = PhoneNumberUtil::getInstance();
371
-        $this->number = $serialized;
372
-        $this->country = $this->lib->getRegionCodeForNumber($this->getPhoneNumberInstance());
373
-    }
374
-
375
-    /**
376
-     * Convert the phone instance to a formatted number.
377
-     *
378
-     * @return string
379
-     */
380
-    public function __toString()
381
-    {
382
-        // Formatting the phone number could throw an exception, but __toString() doesn't cope well with that.
383
-        // Let's just return the original number in that case.
384
-        try {
385
-            return $this->formatE164();
386
-        } catch (Exception $exception) {
387
-            return $this->number;
388
-        }
389
-    }
21
+	use ParsesCountries,
22
+		ParsesFormats,
23
+		ParsesTypes;
24
+
25
+	/**
26
+	 * The provided phone number.
27
+	 *
28
+	 * @var string
29
+	 */
30
+	protected $number;
31
+
32
+	/**
33
+	 * The provided phone country.
34
+	 *
35
+	 * @var array
36
+	 */
37
+	protected $countries = [];
38
+
39
+	/**
40
+	 * The detected phone country.
41
+	 *
42
+	 * @var string
43
+	 */
44
+	protected $country;
45
+
46
+	/**
47
+	 * Whether to allow lenient checks (i.e. landline numbers without area codes).
48
+	 *
49
+	 * @var bool
50
+	 */
51
+	protected $lenient = false;
52
+
53
+	/**
54
+	 * @var \libphonenumber\PhoneNumberUtil
55
+	 */
56
+	protected $lib;
57
+
58
+	/**
59
+	 * Phone constructor.
60
+	 *
61
+	 * @param string $number
62
+	 */
63
+	public function __construct($number)
64
+	{
65
+		$this->number = $number;
66
+		$this->lib = PhoneNumberUtil::getInstance();
67
+	}
68
+
69
+	/**
70
+	 * Create a phone instance.
71
+	 *
72
+	 * @param string       $number
73
+	 * @param string|array $country
74
+	 * @return static
75
+	 */
76
+	public static function make($number, $country = [])
77
+	{
78
+		$instance = new static($number);
79
+
80
+		return $instance->ofCountry($country);
81
+	}
82
+
83
+	/**
84
+	 * Set the country to which the phone number belongs to.
85
+	 *
86
+	 * @param string|array $country
87
+	 * @return static
88
+	 */
89
+	public function ofCountry($country)
90
+	{
91
+		$countries = is_array($country) ? $country : func_get_args();
92
+
93
+		$instance = clone $this;
94
+		$instance->countries = array_unique(
95
+			array_merge($instance->countries, static::parseCountries($countries))
96
+		);
97
+
98
+		return $instance;
99
+	}
100
+
101
+	/**
102
+	 * Format the phone number in international format.
103
+	 *
104
+	 * @return string
105
+	 */
106
+	public function formatInternational()
107
+	{
108
+		return $this->format(PhoneNumberFormat::INTERNATIONAL);
109
+	}
110
+
111
+	/**
112
+	 * Format the phone number in national format.
113
+	 *
114
+	 * @return string
115
+	 */
116
+	public function formatNational()
117
+	{
118
+		return $this->format(PhoneNumberFormat::NATIONAL);
119
+	}
120
+
121
+	/**
122
+	 * Format the phone number in E164 format.
123
+	 *
124
+	 * @return string
125
+	 */
126
+	public function formatE164()
127
+	{
128
+		return $this->format(PhoneNumberFormat::E164);
129
+	}
130
+
131
+	/**
132
+	 * Format the phone number in RFC3966 format.
133
+	 *
134
+	 * @return string
135
+	 */
136
+	public function formatRFC3966()
137
+	{
138
+		return $this->format(PhoneNumberFormat::RFC3966);
139
+	}
140
+
141
+	/**
142
+	 * Format the phone number in a given format.
143
+	 *
144
+	 * @param string $format
145
+	 * @return string
146
+	 * @throws \Propaganistas\LaravelPhone\Exceptions\NumberFormatException
147
+	 */
148
+	public function format($format)
149
+	{
150
+		$parsedFormat = static::parseFormat($format);
151
+
152
+		if (is_null($parsedFormat)) {
153
+			throw NumberFormatException::invalid($format);
154
+		}
155
+
156
+		return $this->lib->format(
157
+			$this->getPhoneNumberInstance(),
158
+			$parsedFormat
159
+		);
160
+	}
161
+
162
+	/**
163
+	 * Format the phone number in a way that it can be dialled from the provided country.
164
+	 *
165
+	 * @param string $country
166
+	 * @return string
167
+	 * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException
168
+	 */
169
+	public function formatForCountry($country)
170
+	{
171
+		if (! static::isValidCountryCode($country)) {
172
+			throw CountryCodeException::invalid($country);
173
+		}
174
+
175
+		return $this->lib->formatOutOfCountryCallingNumber(
176
+			$this->getPhoneNumberInstance(),
177
+			$country
178
+		);
179
+	}
180
+
181
+	/**
182
+	 * Format the phone number in a way that it can be dialled from the provided country using a cellphone.
183
+	 *
184
+	 * @param string $country
185
+	 * @param bool   $removeFormatting
186
+	 * @return string
187
+	 * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException
188
+	 */
189
+	public function formatForMobileDialingInCountry($country, $removeFormatting = false)
190
+	{
191
+		if (! static::isValidCountryCode($country)) {
192
+			throw CountryCodeException::invalid($country);
193
+		}
194
+
195
+		return $this->lib->formatNumberForMobileDialing(
196
+			$this->getPhoneNumberInstance(),
197
+			$country,
198
+			$removeFormatting
199
+		);
200
+	}
201
+
202
+	/**
203
+	 * Get the phone number's country.
204
+	 *
205
+	 * @return string
206
+	 */
207
+	public function getCountry()
208
+	{
209
+		if (! $this->country) {
210
+			$this->country = $this->filterValidCountry($this->countries);
211
+		}
212
+
213
+		return $this->country;
214
+	}
215
+
216
+	/**
217
+	 * Check if the phone number is of (a) given country(ies).
218
+	 *
219
+	 * @param string|array $country
220
+	 * @return bool
221
+	 */
222
+	public function isOfCountry($country)
223
+	{
224
+		$countries = static::parseCountries($country);
225
+
226
+		return in_array($this->getCountry(), $countries);
227
+	}
228
+
229
+	/**
230
+	 * Filter the provided countries to the one that is valid for the number.
231
+	 *
232
+	 * @param string|array $countries
233
+	 * @return string
234
+	 * @throws \Propaganistas\LaravelPhone\Exceptions\NumberParseException
235
+	 */
236
+	protected function filterValidCountry($countries)
237
+	{
238
+		$result = Collection::make($countries)
239
+							->filter(function ($country) {
240
+								$instance = $this->lib->parse($this->number, $country);
241
+
242
+								return $this->lenient
243
+									? $this->lib->isPossibleNumber($instance, $country)
244
+									: $this->lib->isValidNumberForRegion($instance, $country);
245
+							})->first();
246
+
247
+		// If we got a new result, return it.
248
+		if ($result) {
249
+			return $result;
250
+		}
251
+
252
+		// Last resort: try to detect it from an international number.
253
+		if ($this->numberLooksInternational()) {
254
+			$countries[] = null;
255
+		}
256
+
257
+		foreach ($countries as $country) {
258
+			$instance = $this->lib->parse($this->number, $country);
259
+
260
+			if ($this->lib->isValidNumber($instance)) {
261
+				return $this->lib->getRegionCodeForNumber($instance);
262
+			}
263
+		}
264
+
265
+		throw NumberParseException::countryRequired($this->number);
266
+	}
267
+
268
+	/**
269
+	 * Get the phone number's type.
270
+	 *
271
+	 * @param bool $asConstant
272
+	 * @return string|int|null
273
+	 */
274
+	public function getType($asConstant = false)
275
+	{
276
+		$type = $this->lib->getNumberType($this->getPhoneNumberInstance());
277
+
278
+		if ($asConstant) {
279
+			return $type;
280
+		}
281
+
282
+		$stringType = Arr::get(static::parseTypesAsStrings($type), 0);
283
+
284
+		return $stringType ? strtolower($stringType) : null;
285
+	}
286
+
287
+	/**
288
+	 * Check if the phone number is of (a) given type(s).
289
+	 *
290
+	 * @param string $type
291
+	 * @return bool
292
+	 */
293
+	public function isOfType($type)
294
+	{
295
+		$types = static::parseTypes($type);
296
+
297
+		return in_array($this->getType(true), $types, true);
298
+	}
299
+
300
+	/**
301
+	 * Get the PhoneNumber instance of the current number.
302
+	 *
303
+	 * @return \libphonenumber\PhoneNumber
304
+	 */
305
+	public function getPhoneNumberInstance()
306
+	{
307
+		return $this->lib->parse($this->number, $this->getCountry());
308
+	}
309
+
310
+	/**
311
+	 * Determine whether the phone number seems to be in international format.
312
+	 *
313
+	 * @return bool
314
+	 */
315
+	protected function numberLooksInternational()
316
+	{
317
+		return Str::startsWith($this->number, '+');
318
+	}
319
+
320
+	/**
321
+	 * Enable lenient number parsing.
322
+	 *
323
+	 * @return $this
324
+	 */
325
+	public function lenient()
326
+	{
327
+		$this->lenient = true;
328
+
329
+		return $this;
330
+	}
331
+
332
+	/**
333
+	 * Convert the phone instance to JSON.
334
+	 *
335
+	 * @param  int $options
336
+	 * @return string
337
+	 */
338
+	public function toJson($options = 0)
339
+	{
340
+		return json_encode($this->jsonSerialize(), $options);
341
+	}
342
+
343
+	/**
344
+	 * Convert the phone instance into something JSON serializable.
345
+	 *
346
+	 * @return string
347
+	 */
348
+	public function jsonSerialize()
349
+	{
350
+		return $this->formatE164();
351
+	}
352
+
353
+	/**
354
+	 * Convert the phone instance into a string representation.
355
+	 *
356
+	 * @return string
357
+	 */
358
+	public function serialize()
359
+	{
360
+		return $this->formatE164();
361
+	}
362
+
363
+	/**
364
+	 * Reconstructs the phone instance from a string representation.
365
+	 *
366
+	 * @param string $serialized
367
+	 */
368
+	public function unserialize($serialized)
369
+	{
370
+		$this->lib = PhoneNumberUtil::getInstance();
371
+		$this->number = $serialized;
372
+		$this->country = $this->lib->getRegionCodeForNumber($this->getPhoneNumberInstance());
373
+	}
374
+
375
+	/**
376
+	 * Convert the phone instance to a formatted number.
377
+	 *
378
+	 * @return string
379
+	 */
380
+	public function __toString()
381
+	{
382
+		// Formatting the phone number could throw an exception, but __toString() doesn't cope well with that.
383
+		// Let's just return the original number in that case.
384
+		try {
385
+			return $this->formatE164();
386
+		} catch (Exception $exception) {
387
+			return $this->number;
388
+		}
389
+	}
390 390
 }
391 391
\ No newline at end of file
Please login to merge, or discard this patch.
src/Exceptions/NumberFormatException.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -4,14 +4,14 @@
 block discarded – undo
4 4
 
5 5
 class NumberFormatException extends Exception implements PhoneNumberException
6 6
 {
7
-    /**
8
-     * Invalid number format static constructor.
9
-     *
10
-     * @param string $format
11
-     * @return static
12
-     */
13
-    public static function invalid($format)
14
-    {
15
-        return new static('Invalid number format "' . $format . '".');
16
-    }
7
+	/**
8
+	 * Invalid number format static constructor.
9
+	 *
10
+	 * @param string $format
11
+	 * @return static
12
+	 */
13
+	public static function invalid($format)
14
+	{
15
+		return new static('Invalid number format "' . $format . '".');
16
+	}
17 17
 }
18 18
\ No newline at end of file
Please login to merge, or discard this patch.