Каков наилучший способ настроить libphonenumber (PHP) вручную без Composer?

Из-за некоторых ограничений я не могу установить libphonenumber через композитор, поэтому я вручную добавил его в каталог lib моего проекта.
Я получаю следующую ошибку, когда пытаюсь использовать его с помощью ручной установки:< br/> Неустранимая ошибка PHP: класс 'libphonenumber\CountryCodeToRegionCodeMap' не найден в /home/cellulant/CODE/MSISDNVALIDATIONAPI/lib/libphonenumber/src/PhoneNumberUtil.php в строке 404

И это несмотря на то, что CountryCodeToRegionMap.php можно найти в каталоге libphonenumber/src.

Каталог libphonenumber находится в каталоге lib моего проекта. Ниже приведена моя структура каталогов.

├── docs
├── index.php
├── lib
│   └── libphonenumber
│       ├── composer.json
│       ├── docs
│       │    ...
│       ├── LICENSE
│       ├── METADATA-VERSION.txt
│       ├── README.md
│       └── src
│           ...

В моем index.php у меня есть это:

<?php

include "lib/libphonenumber/src/PhoneNumberUtil.php";

$num = "0234567787";

try 
{
    $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();

    $numberProto = $phoneUtil->parse($num, "US");
    var_dump($numberProto);
} 
catch (Exception $ex)
{
    echo "Exception: " . $ex->getMessage() . "\n";
}

person kassold    schedule 13.05.2017    source источник


Ответы (2)


Насколько я знаю, у вас есть 3 варианта:

  1. Вручную потребовать/включить все необходимые классы. Вы уже включили «PhoneNumberUtil.php», но вы также должны включить «CountryCodeToRegionCodeMap.php».

  2. Реализуйте свой собственный автозагрузчик в php: http://php.net/manual/en/language.oop5.autoload.php

  3. Используйте автозагрузчик композитора. Если у вас нет доступа к оболочке, вы можете запускать команды локально и передавать все по ftp на свой веб-хост.

person Jimbolino    schedule 13.05.2017

Согласно документу libphonenumber-php, вы также можете использовать любой PSR4 (http://www.php-fig.org/psr/psr-4/) совместимый автозагрузчик, если вы решите использовать его без composer.

Автор этой версии, @giggsey, говорит, что вам может понадобиться использовать библиотеку Locale (https://github.com/giggsey/Locale). Это заменяет расширение php-intl

Учитывая вашу структуру каталогов, ваш автозагрузчик (например, autoload.php) и при условии, что он находится в вашем каталоге src/, может выглядеть так:

spl_autoload_register(function ($class) {

    //namespace prefix
    $prefix = 'libphonenumber';

    // base directory for the namespace prefix
    $base_dir = __DIR__ . '/../lib/libphonenumber/src/';

    // does the class use the namespace prefix?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return;
    }

    // get the relative class name
    $relative_class = substr($class, $len);

    // replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    // if the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});

Затем вы можете импортировать его, используя...

require __DIR__ . "autoload.php";
try
{
   $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
   //code...
}
catch(NumberParseException $ex)
{
   //code ...
}

Возможно, вам также придется загрузить библиотеку Locale в autoload.php аналогичным образом. Для libphonenumber-php требуется расширение mbstring.

Взгляните на примеры в..

libphonenumber/README
libphonenumber/docs/
person Seyram Komla Sapaty    schedule 31.05.2017