IO\Core::call() и IO\Core::callAction()
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
IO\Core — центральный класс для межсерверных и локальных вызовов методов. Два основных метода: call() для вызова классов и callAction() для вызова API.
Требования: PHP ^8.2, Illuminate (Laravel 13), PHPUnit 11
IO\Core::call()
Вызов статического метода класса. Работает локально или через HTTP (cURL) на удалённый сервер.
public static function call(
string $entity,
array $params,
int $fromio = 0,
bool $log_echo = false
): mixed
Параметры:
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$entity | string | — | Да | Точечный путь к методу (напр. app.class.user.getById) |
$params | array | [] | Нет | Параметры метода |
$fromio | int | 0 | Нет | 1 — вызов из IO (блокирует проксирование) |
$log_echo | bool | false | Нет | Включить отладочный вывод |
Возвращает: Результат метода или массив ['error_code' => int, 'error_str' => string].
Формат entity
<проект>.<тип>.<класс>.<метод>
| Часть | Описание | Примеры |
|---|---|---|
| Проект | Имя проекта | app, io, com.sso |
| Тип | class | Всегда class для call() |
| Класс | Имя класса | user, product, unit |
| Метод | Статический метод | getById, search, login |
Примеры
// Локальный вызов метода класса
$result = \IO\Core::call('app.class.user.getById', ['id' => 42]);
// Эквивалентно: \App\Classes\User::getById(['id' => 42])
// Вызов метода в IO (framework)
$result = \IO\Core::call('io.class.unit.search', [
'filter' => ['is_active' => 1],
]);
// Межсерверный вызов
// Если 'com.sso' — отдельный сервер, запрос отправится через cURL
$result = \IO\Core::call('com.sso.class.user.login', [
'login' => 'admin',
'password' => 'secret',
]);
// С отладочным выводом
$result = \IO\Core::call('app.class.product.search', [
'filter' => ['category' => 5],
], 0, true);
IO\Core::callAction()
Вызов action-метода API. Поддерживает IO\Api\CoreApi и IO\Api\CrudApi.
public static function callAction(
string $entity,
$params,
int $fromentity = 0,
int $filesupload = 0,
bool $log_echo = false
): mixed
Параметры:
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$entity | string | — | Да | Точечный путь к API (напр. app.model.user.search) |
$params | array|mixed | [] | Нет | Параметры action |
$fromentity | int | 0 | Нет | 1 — вызов из другой сущности (блокирует проксирование) |
$filesupload | int | 0 | Нет | 1 — загрузка файлов из $_FILES |
$log_echo | bool | false | Нет | Включить отладочный вывод |
Формат entity
<проект>.<тип>.<класс>.<метод>
| Часть | Описание | Примеры |
|---|---|---|
| Проект | Имя проекта | app, io |
| Тип | model или api | model — CrudApi, api — CoreApi |
| Класс | Имя API класса | user, session, notification |
| Метод | Имя action (без action) | search, create, save, delete |
Важно: метод указывается без префикса action. Фреймворк сам добавит префикс при вызове.
Примеры
// Поиск через CrudApi
$result = \IO\Core::callAction('app.model.user.search', [
'filter' => ['status' => 'active'],
'limit' => 20,
]);
// Получение по ID
$result = \IO\Core::callAction('app.model.user.getByID', ['pkid' => 42]);
// Создание
$result = \IO\Core::callAction('app.model.user.create', [
'item' => ['name' => 'Иван', 'email' => 'ivan@example.com'],
]);
// Обновление
$result = \IO\Core::callAction('app.model.user.save', [
'pkid' => 42,
'item' => ['name' => 'Иван Петров'],
]);
// Удаление
$result = \IO\Core::callAction('app.model.user.delete', ['pkid' => 42]);
// Вызов кастомного API
$result = \IO\Core::callAction('app.api.notification.send', [
'to' => 'user@example.com',
'message' => 'Привет!',
]);
// Сессия
$result = \IO\Core::callAction('app.model.session.login', [
'login' => 'admin',
'password' => 'secret',
]);
// Загрузка файлов
$result = \IO\Core::callAction('app.model.document.upload', [
'item' => ['name' => 'Документ'],
], 0, 1); // filesupload = 1
IO\Core::callActionQuiet()
Вызов action с перехватом вывода в буфер.
public static function callActionQuiet(
string $entity,
$params,
string &$content,
int $fromentity = 0,
int $filesupload = 0
): mixed
$result = \IO\Core::callActionQuiet(
'app.api.report.render',
['report_id' => 1],
$html // сюда запишется HTML-вывод action
);
// $result — данные action
// $html — захваченный вывод
Вспомогательные методы
entityToFile()
Парсинг entity-строки в структуру данных.
public static function entityToFile(string $entity, array $params = []): ?array
$info = \IO\Core::entityToFile('app.class.user.getById', [
'hasMethod' => true,
'isAction' => false,
]);
// [
// 'source' => 'app',
// 'type' => 'class',
// 'method' => 'getById',
// 'class' => '\App\Classes\User',
// 'postfix' => 'class.user',
// ]
Instance()
Создание экземпляра класса по entity.
public static function Instance(string $entity): object
$user = \IO\Core::Instance('app.class.user');
// Экземпляр \App\Classes\User
checkRules()
Проверка разрешений для метода.
public static function checkRules(array $entity_arr): int
$errorCode = \IO\Core::checkRules([
'class' => '\App\Api\UserApi',
'method' => 'actionSearch',
'type' => 'api',
]);
// EIO_OK если разрешено, EIO_DENY если нет
signData()
Генерация HMAC-подписи для межсерверных запросов.
public static function signData(string $entity, array $data, int $time): string
sendData()
HTTP-запрос через cURL.
public static function sendData(
string $url,
array $post,
?string $cookie = '',
bool $log_echo = false
): array
Возвращает: [response, http_code, raw_output]
Межсерверное взаимодействие
Локальные вызовы
Если source = app, io или текущий проект — вызов выполняется локально:
\IO\Core::callAction('app.model.user.search', [...]);
// → \App\Api\UserApi::actionSearch(...)
Удалённые вызовы
Если source — другой проект из $ioProjects, запрос отправляется через HTTP:
\IO\Core::callAction('com.sso.class.user.login', [...]);
// → HTTP POST http://sso.devkdt.io/gate/com.sso.class.user.login/
Защита
- Проверка IP-адресов серверов (
$ioProjectsIP) - HMAC-подпись запросов (
IOSECRETKEY) - Проверка
rules()классов - Время жизни запроса (120 секунд)