PHP
#php#php-8-5#bitrix#pipe#agent#api#pipeline

PHP 8.5: pipe-оператор для пайплайна данных в Bitrix (агент, API)

Обработка входящих данных цепочкой через pipe-оператор |> (PHP 8.5): строка → trim → json_decode → фильтр. Для агентов и API в 1C-Битрикс.

Как использовать

  1. Синтаксис: $value |> callable(...) — значение передаётся первым аргументом в callable справа. Для встроенных функций используйте first-class callable: trim(...).
  2. Цепочка: $raw |> trim(...) |> fn($s) => json_decode($s, true) |> ... Читается сверху вниз без вложенных скобок.
  3. 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+.

Проверка

  1. Корректная цепочка — передайте валидную 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; пустые строки отфильтрованы. Подставьте путь к файлу с функцией, если она в отдельном файле.

  1. Пустой и невалидный JSON — processIncomingPayload(”) должен вернуть []; processIncomingPayload(‘not json’) — [] (json_decode вернёт null, ?? [] даёт пустой массив, array_filter его не меняет).

  2. 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), Идемпотентный агент с блокировкой.