PhoneNumberToCarrierMapper.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. /**
  3. *
  4. *
  5. * @author giggsey
  6. * @created: 02/10/13 16:52
  7. * @project libphonenumber-for-php
  8. */
  9. namespace libphonenumber;
  10. use Giggsey\Locale\Locale;
  11. use libphonenumber\prefixmapper\PrefixFileReader;
  12. class PhoneNumberToCarrierMapper
  13. {
  14. /**
  15. * @var PhoneNumberToCarrierMapper[]
  16. */
  17. protected static $instance = array();
  18. /**
  19. * @var PhoneNumberUtil
  20. */
  21. protected $phoneUtil;
  22. /**
  23. * @var PrefixFileReader
  24. */
  25. protected $prefixFileReader;
  26. /**
  27. * @param string|null $phonePrefixDataDirectory
  28. */
  29. protected function __construct($phonePrefixDataDirectory)
  30. {
  31. if ($phonePrefixDataDirectory === null) {
  32. $phonePrefixDataDirectory = __DIR__ . '/carrier/data/';
  33. }
  34. $this->prefixFileReader = new PrefixFileReader($phonePrefixDataDirectory);
  35. $this->phoneUtil = PhoneNumberUtil::getInstance();
  36. }
  37. /**
  38. * Gets a {@link PhoneNumberToCarrierMapper} instance to carry out international carrier lookup.
  39. *
  40. * <p> The {@link PhoneNumberToCarrierMapper} is implemented as a singleton. Therefore, calling
  41. * this method multiple times will only result in one instance being created.
  42. *
  43. * @param string|null $mappingDir
  44. * @return PhoneNumberToCarrierMapper
  45. */
  46. public static function getInstance($mappingDir = null)
  47. {
  48. if (!array_key_exists($mappingDir, static::$instance)) {
  49. static::$instance[$mappingDir] = new static($mappingDir);
  50. }
  51. return static::$instance[$mappingDir];
  52. }
  53. /**
  54. * Returns a carrier name for the given phone number, in the language provided. The carrier name
  55. * is the one the number was originally allocated to, however if the country supports mobile
  56. * number portability the number might not belong to the returned carrier anymore. If no mapping
  57. * is found an empty string is returned.
  58. *
  59. * <p>This method assumes the validity of the number passed in has already been checked, and that
  60. * the number is suitable for carrier lookup. We consider mobile and pager numbers possible
  61. * candidates for carrier lookup.
  62. *
  63. * @param PhoneNumber $number a valid phone number for which we want to get a carrier name
  64. * @param string $languageCode the language code in which the name should be written
  65. * @return string a carrier name for the given phone number
  66. */
  67. public function getNameForValidNumber(PhoneNumber $number, $languageCode)
  68. {
  69. $languageStr = Locale::getPrimaryLanguage($languageCode);
  70. $scriptStr = '';
  71. $regionStr = Locale::getRegion($languageCode);
  72. return $this->prefixFileReader->getDescriptionForNumber($number, $languageStr, $scriptStr, $regionStr);
  73. }
  74. /**
  75. * Gets the name of the carrier for the given phone number, in the language provided. As per
  76. * {@link #getNameForValidNumber(PhoneNumber, Locale)} but explicitly checks the validity of
  77. * the number passed in.
  78. *
  79. * @param PhoneNumber $number The phone number for which we want to get a carrier name
  80. * @param string $languageCode Language code for which the description should be written
  81. * @return string a carrier name for the given phone number, or empty string if the number passed in is
  82. * invalid
  83. */
  84. public function getNameForNumber(PhoneNumber $number, $languageCode)
  85. {
  86. $numberType = $this->phoneUtil->getNumberType($number);
  87. if ($this->isMobile($numberType)) {
  88. return $this->getNameForValidNumber($number, $languageCode);
  89. }
  90. return '';
  91. }
  92. /**
  93. * Gets the name of the carrier for the given phone number only when it is 'safe' to display to
  94. * users. A carrier name is considered safe if the number is valid and for a region that doesn't
  95. * support
  96. * {@linkplain http://en.wikipedia.org/wiki/Mobile_number_portability mobile number portability}.
  97. *
  98. * @param $number PhoneNumber the phone number for which we want to get a carrier name
  99. * @param $languageCode String the language code in which the name should be written
  100. * @return string a carrier name that is safe to display to users, or the empty string
  101. */
  102. public function getSafeDisplayName(PhoneNumber $number, $languageCode)
  103. {
  104. if ($this->phoneUtil->isMobileNumberPortableRegion($this->phoneUtil->getRegionCodeForNumber($number))) {
  105. return '';
  106. }
  107. return $this->getNameForNumber($number, $languageCode);
  108. }
  109. /**
  110. * Checks if the supplied number type supports carrier lookup.
  111. * @param int $numberType A PhoneNumberType int
  112. * @return bool
  113. */
  114. protected function isMobile($numberType)
  115. {
  116. return ($numberType === PhoneNumberType::MOBILE ||
  117. $numberType === PhoneNumberType::FIXED_LINE_OR_MOBILE ||
  118. $numberType === PhoneNumberType::PAGER
  119. );
  120. }
  121. }