Add phone number parsing functionality

Added a new method 'parse' in the PhonenumberHelper class in ChillMainBundle to sanitize and parse phone numbers. This method specifically handles phone numbers that start with '00', '+' or '0'. Associated unit tests for this new method were also added in PhonenumberHelperTest.php.
This commit is contained in:
Julien Fastré 2024-05-17 12:16:28 +02:00
parent 76c076a5f3
commit c81828e04f
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
2 changed files with 63 additions and 0 deletions

View File

@ -76,6 +76,24 @@ final class PhonenumberHelper implements PhoneNumberHelperInterface
->formatOutOfCountryCallingNumber($phoneNumber, $this->config['default_carrier_code']); ->formatOutOfCountryCallingNumber($phoneNumber, $this->config['default_carrier_code']);
} }
/**
* @throws NumberParseException
*/
public function parse(string $phoneNumber): PhoneNumber
{
$sanitizedPhoneNumber = $phoneNumber;
if (str_starts_with($sanitizedPhoneNumber, '00')) {
$sanitizedPhoneNumber = '+'.substr($sanitizedPhoneNumber, 2, null);
}
if (!str_starts_with($sanitizedPhoneNumber, '+') && !str_starts_with($sanitizedPhoneNumber, '0')) {
$sanitizedPhoneNumber = '+'.$sanitizedPhoneNumber;
}
return $this->phoneNumberUtil->parse($sanitizedPhoneNumber, $this->config['default_carrier_code']);
}
/** /**
* Get type (mobile, landline, ...) for phone number. * Get type (mobile, landline, ...) for phone number.
*/ */

View File

@ -12,6 +12,7 @@ declare(strict_types=1);
namespace Chill\MainBundle\Tests\Phonenumber; namespace Chill\MainBundle\Tests\Phonenumber;
use Chill\MainBundle\Phonenumber\PhonenumberHelper; use Chill\MainBundle\Phonenumber\PhonenumberHelper;
use libphonenumber\PhoneNumber;
use libphonenumber\PhoneNumberUtil; use libphonenumber\PhoneNumberUtil;
use Psr\Log\NullLogger; use Psr\Log\NullLogger;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
@ -52,12 +53,36 @@ final class PhonenumberHelperTest extends KernelTestCase
]; ];
} }
public static function providePhoneNumbersToParse(): iterable
{
$util = PhoneNumberUtil::getInstance();
yield [
'FR',
'+32486544999',
$util->parse('+32486544999', 'FR'),
];
yield [
'FR',
'32486544999',
$util->parse('+32486544999', 'FR'),
];
yield [
'FR',
'0228858040',
$util->parse('+33228858040', 'FR'),
];
}
/** /**
* @dataProvider formatPhonenumbers * @dataProvider formatPhonenumbers
*/ */
public function testFormatPhonenumbers(string $defaultCarrierCode, string $phoneNumber, string $expected) public function testFormatPhonenumbers(string $defaultCarrierCode, string $phoneNumber, string $expected)
{ {
$util = PhoneNumberUtil::getInstance(); $util = PhoneNumberUtil::getInstance();
$subject = new PhonenumberHelper( $subject = new PhonenumberHelper(
new ArrayAdapter(), new ArrayAdapter(),
new ParameterBag([ new ParameterBag([
@ -70,4 +95,24 @@ final class PhonenumberHelperTest extends KernelTestCase
$this->assertEquals($expected, $subject->format($util->parse($phoneNumber))); $this->assertEquals($expected, $subject->format($util->parse($phoneNumber)));
} }
/**
* @dataProvider providePhoneNumbersToParse
*/
public function testParsePhonenumbers(string $defaultCarrierCode, string $phoneNumber, PhoneNumber $expected): void
{
$subject = new PhonenumberHelper(
new ArrayAdapter(),
new ParameterBag([
'chill_main.phone_helper' => [
'default_carrier_code' => $defaultCarrierCode,
],
]),
new NullLogger()
);
$actual = $subject->parse($phoneNumber);
self::assertTrue($expected->equals($actual));
}
} }