PHP 8.5: pipe-оператор для пайплайна данных в Bitrix (агент, API)
Обработка входящих данных цепочкой через pipe-оператор |> (PHP 8.5): строка → trim → json_decode → фильтр. Для агентов и API в 1C-Битрикс.
Как использовать
- Синтаксис: $value |> callable(...) — значение передаётся первым аргументом в callable справа. Для встроенных функций используйте first-class callable: trim(...).
- Цепочка: $raw |> trim(...) |> fn($s) => json_decode($s, true) |> ... Читается сверху вниз без вложенных скобок.
- PHP 8.5+. В Bitrix проверьте версию PHP на сервере.
В агентах и API Bitrix входящие данные часто проходят несколько этапов: сырая строка → trim → json_decode → фильтрация пустых полей. Цепочка вложенных вызовов трудно читается и легко ошибиться порядком. В PHP 8.5 добавлен pipe-оператор (|>): значение слева передаётся первым аргументом в callable справа, цепочка читается сверху вниз. Проблема: без pipe код вида array_filter(json_decode(trim($raw), true), ...) плохо читается. Симптомы: путаница с порядком, сложно добавить шаг. Ниже — пайплайн обработки входящей строки (POST, вебхук, опция) по документации PHP 8.5; проверка и типичные ошибки.
Решение
Pipe-оператор передаёт результат предыдущего шага в следующий вызов. Удобно в агентах и API Bitrix: сырой ввод → нормализация → декодирование → фильтрация.
<?php
/**
* Обработка входящей строки запроса (агент, REST, вебхук).
* PHP 8.5+: pipe передаёт результат предыдущего шага в следующий.
*/
function processIncomingPayload(string $raw): array
{
return $raw
|> trim(...)
|> fn(string $s) => json_decode($s, true) ?? []
|> fn(array $data) => array_filter($data, fn($v) => $v !== null && $v !== '');
}
// Пример: данные от внешнего сервиса или POST-тело
$payload = processIncomingPayload($_POST['data'] ?? '{}');
В агенте или обработчике REST:
$body = file_get_contents('php://input');
$data = processIncomingPayload($body);
$json = \Bitrix\Main\Config\Option::get('mymodule', 'webhook_payload', '{}');
$data = processIncomingPayload($json);
Синтаксис: $value |> callable(...) эквивалентно callable($value). Для встроенных функций используйте first-class callable: trim(...). В Bitrix убедитесь, что на сервере PHP 8.5+.
Проверка
- Корректная цепочка — передайте валидную JSON-строку:
php -r "
function processIncomingPayload(string \$raw): array {
return \$raw |> trim(...) |> fn(string \$s) => json_decode(\$s, true) ?? [] |> fn(array \$d) => array_filter(\$d, fn(\$v) => \$v !== null && \$v !== '');
}
var_dump(processIncomingPayload(' {\"a\":1,\"b\":\"\"} '));
"
Ожидаем массив с ключом a и значением 1; пустые строки отфильтрованы. Подставьте путь к файлу с функцией, если она в отдельном файле.
-
Пустой и невалидный JSON — processIncomingPayload(”) должен вернуть []; processIncomingPayload(‘not json’) — [] (json_decode вернёт null, ?? [] даёт пустой массив, array_filter его не меняет).
-
PHP 8.5 — синтаксис |> работает только в PHP 8.5+. На старых версиях будет синтаксическая ошибка. Проверьте:
php -v.
Типичные ошибки
- Забыли … в trim — в pipe нужно передавать callable. Для trim пишите
trim(...)(first-class callable), а неtrim(без вызова и без …). Иначе будет ошибка или неверное поведение. - Тип между шагами — каждый шаг получает результат предыдущего. Убедитесь, что стрелочная функция принимает правильный тип (например string после trim, array после json_decode) и возвращает то, что ожидает следующий шаг.
- PHP меньше 8.5 — pipe добавлен в 8.5. На старых версиях используйте обычные вложенные вызовы или временные переменные.
Где применять
- Bitrix: агенты (вход из опции или очереди), REST-обработчики, вебхуки — любая обработка сырой строки в структурированные данные.
- Любой PHP 8.5+: пайплайны нормализации и валидации входящих данных без глубокой вложенности.
Связанные сниппеты: Option::get с union type, array_first / array_last (PHP 8.5), Идемпотентный агент с блокировкой.