Добавить файл
key.json, client_secret.json
в корень проекта (в той же папке где composer.json, docker-compose.yml)
key.json
должен содержать API ключ, полученный в Google API console:
{
"key": "FIzaSyFQbldR-7IWggcUOg_RVlckIwJXDGnKreY"
}
client_secret.json
так же создается в Google API console, в разделе Идентификаторы клиентов OAuth 2.0. Надо вписать редирект Url http://localhost:8000/googleapi/oauth/authorize
для локальной версии
Для локального разворачивания использовать скрипт init.sh
:
git clone https://github.com/ptflp/yii1-google-api.git
cd yii1-google-api
./init.sh
Внимание ваш пользователь должен состоять в группе docker подробнее тут
содержимое скрипта init.sh
#!/bin/bash
sed -i "s/- '80:80'/- '8000:80'/" ./docker-compose.yml
sed -i "s/'YII_DEBUG',false/'YII_DEBUG',true/" ./web/index.php
docker network create skynet
docker-compose up -d
echo 'Wait for db initialization'
sleep 30s
docker exec g-api-db mysql -proot -e "create database googleApi"
docker exec g-api-app composer install
docker exec g-api-app mkdir /app/protected/runtime
docker exec g-api-app bash ./fix_perm.sh
docker exec g-api-app /app/protected/yiic migrate --interactive=0
Можно пользоваться
-
Server side:
- docker-compose
- busybox (data container for unix sock)
- yiisoftware/yii2-php:7.1-apache Можно наверно было использовать 7.2 Не тестировал, взял из используемых.
- redis Кэширование
- mysql используется latest
-
Backend:
- yiisoft/yii 1.1.16 не знаю почему именно эта версия
- guzzlehttp/guzzle хороший http клиент для POST GET запросов с параметрами. POST используется при авторизации
- php-di/php-di Dependency Injection Container
- predis/predis php redis
-
Frontend:
-
Tools:
- phpcs (PSR fix)
- git flow git branching system
Основным объектом запросов является DataWrapper: - Выполняет функцию кэширования - Фильтрация данных - Отправляет запросы Google Places API
.
└── DataWrapper
├── AddressesCache // Кэширование адресов
│ └── PredisClient
├── PlacesCache // Кэширование заведений
│ └── PredisClient
└── PlaceSearch // Запрос к Google Places API
├── City
└── GooglePlacesApi
└── ClientAdaptor
└── GuzzleHttp
DI.php - преобразован в компоненту, доступен через:
Yii::app()->DI->container
- Кэширование:
- Идет обращение к спискам по ключам
- PlaceCache:
- Идет обращение к спискам по ключам
'c:'.$cityId.':p:'.$keyword
- Возвращает список place_id
"p:".$item['place_id'];
- AddressCache:
'c:'.$cityId.':a:'.$keyword;
- Возвращает список place_id
$key ="a:".$item['id'];
- PlaceSearch (Поиск в Google Place API):
- Multiple types queries deprecated. Поэтому пришлось захардкодить и делать запрос по каждому типу
- Также при коротком запросе "лена" нет результата. Идет подстановка руссифицированных типоов "гостиница лена", "кинотеатр лена". Но не во всех типах такое поведение, надо тестировать.
- При поиске мест использовался Google Place Search API - nearby search, так как Place Types Table 1 можно использовать только в Place Search, в Autocomplete используется Types Table 3 .
- Идет поиск по координатам города radius 17000, ограничение поиска до 50000 метров.
- При поиске города используется Google Place Autocomplete, затем координаты города берутся из Google Place Details. Данные сохраняются в базу, при поиске мест запросов в API по городам не происходит.
Основная часть кода в папке modules.
.
├── components
│ ├── Controller.php
│ ├── DI.php // Dependency injection container php-di
│ ├── PhpAuthManager.php
│ └── WebUser.php
├── config
│ ├── auth.php
│ ├── console.php
│ ├── database2.php
│ ├── database.php
│ ├── di-config.php
│ ├── main.php
│ └── php-di.php
├── controllers
│ ├── SiteController.php
│ └── UserController.php
├── extensions
│ └── materialwidgets // Кривой виджет надо допиливать
│ ├── NavMenu.php
│ └── views
│ └── NavMenuView.php
├── migrations
│ ├── m181016_105613_city.php
│ └── m181016_140919_tbl_user.php
├── models
│ ├── CityHelper.php
│ ├── City.php
│ └── User.php
└── modules
├── admin
│ ├── AdminModule.php
│ ├── controllers
│ │ ├── CityController.php
│ │ └── UserController.php
│ └── views
│ ├── city
│ │ └── index.php
│ ├── default
│ │ └── index.php
│ ├── layouts
│ │ ├── column1.php
│ │ ├── column2.php
│ │ ├── main.php
│ │ └── material.php
│ └── user
│ ├── admin.php
│ ├── create.php
│ ├── _form.php
│ ├── index.php
│ ├── _search.php
│ ├── update.php
│ ├── _view.php
│ └── view.php
└── googleapi
├── components
│ ├── ClientAdaptorInterface.php
│ ├── ClientAdaptor.php
│ ├── GoogleOauthInterface.php
│ ├── GoogleOauth.php
│ ├── GooglePlacesApiInterface.php
│ ├── GooglePlacesApi.php // Много лишних методов, нужен рефактор
│ └── UserIdentity.php
├── controllers
│ ├── OauthController.php
│ └── PlaceController.php
├── GoogleapiModule.php
└── models
├── AddressesCache.php
├── DataWrapper.php
├── PlacesCache.php
├── PlaceSearch.php
└── UserAuthorize.php