Використання GeoNames в Laravel

5 хв. читання

Для використання GeoNames в Laravel створений пакунок composer. Детальніше передивитися, які вимоги існують для цього пакету можна на сторінці пакунку

Так сталося, що мені потрібно додати в застосунок підтримку геоданих для шляхів доставки. І як виявилося, даний сервіс є найкращим безкоштовним рішенням.

Початок

На сторінці пакунку є інформація про його встановлення, але підводні камені з якими я стикнувся, виявилися досить таки цікавими та абсолютно не очікуваними. Так, для встановлення пакету потрібно ввести команду:

composer require michaeldrennen/geonames

Першою проблемою на моєму шляху стала відсутність підтримки моєї версії фреймворку Laravel (потрібна 5.5, у мене ж використовувалася 5.4). Вирішення я знайшов у встановленні більш старої версії пакету (0.0.9, а не 1.0.0), примусово вибравши її при встановленні:

composer require michaeldrennen/geonames:0.0.9

Але тепер композер вказав мені, що відмовляється встановлювати пакет без підключення в php.ini розширення php_intl.dll (так, працюю я на Windows, оскільки багато інструментів розробника, що використовуються в компанії, відсутні для інших ОС, а користуватися Wine для деяких з них – знущання з заліза мого ноутбука).

Розкоментувавши рядок з цим розширенням, перезапустивши сервер, повторюю кроки вище.

Почалося встановлення, composer не знайшов жодних проблем. Також додаю до масиву providers нового провайдера в файлі config/app.php:

MichaelDrennen\\Geonames\\GeonamesServiceProvider::class,

Рухаємось до наступного кроку: запуск міграції, щоб пакет створив для себе таблиці у БД:

php artisan migrate

І тут же стикаюся з наступною проблемою: у файлі міграції використовується клас FeatureClassSeeder, який без лишніх запитань був знайдений через IDE, але artisan вперто не хоче його бачити.

І так, не знайшовши нічого більш логічного для вирішення цього питання, я вирішив оновити версію Laravel до 5.5, заздалегідь поцікавившись, чи не поламає оновлення весь застосунок.

Оновлюємо Laravel до 5.5

В корені проекту відкриваємо на редагування файл composer.json, змінюємо версію:

"laravel/framework": "5.5.*" 

Після чого виконую composer update.

Перевіривши основні аспекти роботи сайту, переконавшись, що все працює як і раніше, можу продовжувати зі встановленням GeoNames.

Повертаємось до початку

Намагаюсь виконати стандартне встановлення останньої версії, розуміючи, що ймовірність зробити це без проблем коливається між «нереально» та «чому б ні?»:

composer require michaeldrennen/geonames

І, на диво, встановлення пройшло без яких-небудь проблем. Гаразд, продовжуємо по інструкції на сторінці пакету:

php artisan migrate

І знову все виконується без усяких проблем, міграції виконалися, таблиці були створені. Йдемо далі.

На вибір нам пропонують завантажити дані в нашу базу. Я вирішив, що в проекті мені знадобляться усі дані по країнах, що доступні на даному сервісі (хоча розумію, що без деяких країн все ж можна було обійтись), і виконав команду на встановлення усього, що пропонує сервіс:

php artisan geonames:install

Після завантаження основних файлів з інформацією, консоль почала нецензурно вказувати мені напрям «на двері», оскільки мій MySQL не підтримує команду LOAD DATA LOCAL INFILE.

Починаємо розбиратися: ця команда використовується для додавання даних у таблицю бази, беручи їх з файлу. Окей, гугл, як її активувати?

Знайшлось декілька налаштувань php та mysql, які треба змінити: Для php потрібно розкоментувати рядок mysqli.allow_local_infile = On в файлі php.ini, або вказати On замість Off. Для mysql потрібно змінити параметр local-infile, прирівняти його замість 0 до 1. Перезавантажую сервер. Повторюю вищевказані кроки. І так, такої помилки більше не виникає. Але виникла інша.

Чомусь php скрипт намагався знайти файли, що розміщалися за шляхом, в якому були відсутні майже усі слеші... і це мене дуже зацікавило. Вирішення проблеми стало банальним. Розробники цього пакету, напевне, були впевнені, що користувачі не використовуватимуть його на Windows, тому їх жодним чином не зачепила ця проблема.

Як відомо, шляхи в Windows використовують back-слеш, символ, що використовується для екранування символів в php. Додаємо в функцію insertIsoLanguageCodesWithLoadDataInfile до файлу /vendor/michaeldrennen/geonames/src/Console/IsoLanguageCode.php першим рядком: $localFilePath = str_replace('\\\\','/', $localFilePath); Тепер все працює, скрипт почав завантажувати дані до бази.

Подальша робота з пакунком

Далі робота з даним пакунком, швидше за все, стандартна, без яких-небудь підводних каменів. Проте це мені доведеться дізнатися трохи згодом, адже вибравши встановлення «всього і вся», процес отримання даних по усім країнам затягнувся уже на годину... Очікуйте оновлення, якщо в мене буде що додати...

UPDATE

На жаль використання пакунку увінчалося шумним фіаско. Документації по методах роботи з ним знайдено не було. Як альтернатива використовувались пакунки ipalaus/geonames, та низка інших, які так і не «завелись» під Laravel 5.4 чи 5.5. Але знайшовся пакунок, що підійшов для версії Laravel 5.4, встановився без додаткових запитань, та, що найцікавіше, працює.

Моя порада: якщо потрібно використовувати базу даних з містами, районами, областями, чи іншою інформацією, то використовуйте пакунок yurtesen/geonames, після завантаження баз даних, копіюйте данні у свою таблицю, та пишіть власні методи роботи з нею, адже адекватного пакету для роботи «з коробки» я не знайшов. У останньому згаданому пакунку є непогана wiki, хоча було б непогано її розвинути, є досить таки детальна інструкція зі встановлення. Вдалось реалізувати навіть пробну версію текстового поля з підвантаженням даних по мірі вводу тексту. Можливо у вас знайдеться інформація по доступних бібліотеках/базах, де можна отримати геодані, нехай навіть платні версії, залюбки зверну увагу, пишіть в коментарі.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація