IO v7. Доступ к участкам проекта
Термины
- Gate Protocol – протокол общения между двумя бэкендами. Этот протокол позволяет вызывать статические методы class. Для авторизации используется секретный ключ и проверка по IP адресу.
- Entity Protocol – протокол общения между фронтендом и бэкендом. Этот протокол позволяет вызывать методы api (model). Для авторизации используется токен авторизации, сохраненный в cookie.
- Entity Name – название сущности, к которой нужно обратиться.
Описание
В данной версии фреймворка доступ к class, api (model) любого проекта осущствляется следующим образом:

ЗАМЕТКА
Во фреймворке IO v6 помимо class и model, можно было обращаться еще и к view и controller.
Но в IO7 появились модули, из-за чего способ получения доступа немного видоизменился.
Используется нотация "точка". Каждый элемент разделяется знаком точки.
Первое слово (или набор слов, разделяемых точкой) - это apiname проекта, в котором находится требуемый файл (например: com это проект кабинет, com.notice это проект системы уведомлений и т.д. Полный список проектов и их apiname содержится в глобальной переменной $ioProjects, а apiname проекта устанавливается в переменной IOPROJECT в файле project/conf.php). Если обращение происходит к локальному файлу (файлу текущего проекта), то используется слово app. Есл иобращение происходит к файлу фреймворка, то используется слово io.
Второе слово - это тип файла.
Существует всего 2 типа:
class.api,model.
Третье слово (или набор слов, разделяемых точкой) - (только для модулей) это имя модуля, указываемое в методе module_name() в его файле настроек.
Четвертое слово - это папка или папки, разделяемые точкой, т.е. путь до требуемого файла (при необходимости). Подпапки указываются точечной нотацией.
Пятое слово - это имя требуемого файла.
Шестое слово - (только для class и api (model)) название вызываемого метода.
- Для api (model) - название метода без префикса
actionиdo, начиная с маленькой буквы. - Для class - название метода, начиная с маленькой буквы.
Пример:
// вызов метода dbsearch2() class файла app/class/cms/widgets.php проекта com
'com.class.cms.widgets.dbsearch2'
// вызов метода dbsearch2() локального class файла app/Classes/Goods.php
'app.class.goods.dbsearch2'
// вызов метода doWorld() локального api (model) файла app/Api/HelloApi.php
'app.api.hello.world'
// аналог вызова вышеописанного метода (сохранен старый формат)
'app.model.hello.world'
Обращение к Entity Protocol
Адрес Entity Protocol:
http://<домен_проекта>/entity/<entity_name>/?resultType=json&resultNoParams=0&account=56340&lang=ru
Обращаться через Entity Protocol можно только к api (model).
Get параметры:
resultType: возвращаемый результат.html: в формате html.json: в формате json (рекомендуется по умолчанию).serialize: в формате serialize array.
resultNoParams: результат не должен содержать входных параметров.1: да (если передается большой файл, то нужно использовать эту опцию).0: нет (рекомендуется во всех остальных случаях).
account: под каким аккаунтом нужно выполнять код.lang: язык.ru: русский (рекомендуется по умолчанию).
Передаваемые cookie:
bmc_session: сессия.
Post параметры:
entitypost: массив входных данных.
Выходные данные:
params: входные данные, еслиresultNoParams=0.method: метод, который был вызван.res: результат операции.res.error_code: номер ошибки.res.error_str: текст ошибки.content: что выводила функция через echo.ms: серверное время выполнения функции.
{
"resultNoParams": false,
"params": {
"resultNoParams": "0",
"account": "56340",
"lang": "ru"
},
"method": "com.notice.model.notices.getUnreadedCount",
"res": {
"error_code": 1,
"error_str": "",
"count": 0
},
"content": "",
"ms": -356
}
Обращение к Gate Protocol
Чтобы обратиться к Gate Protocol, нужно отправить POST запрос по адресу:
http://<домен_проекта>/gate/<entity_name>/
Обращаться через Gate Protocol можно только к class.
Post параметры:
entitypost: массив входных данных.sign: подпись сервера, который отправил запрос.time: время отправки запроса.
Выходные данные:
serverfrom: с какого сервера пришел ответ.method: метод, который был вызван.res.error_code: номер ошибки.res.error_str: текст ошибки.content: что выводила функция через echo.ms: серверное время выполнения функции.
Данные всегда возвращаются в формате JSON.
Метод подписи
$str = $entity . '|' . $time;
$sign = hash_hmac('sha512', $str, IOSECRETKEY);
Во время проверки подписи проверяется время формирования пакета. Если пакет был сформирован более 2х минут назад, то этот запрос считается устаревшим и выдается ошибка EIO_DENY.