dimitriytiho/feed-builder-kd
Composer 安装命令:
composer require dimitriytiho/feed-builder-kd
包简介
Feed xml and json (NDJSON) generator
README 文档
README
Создать xml фид легко, не надо разбираться и настаивать неудобные теги, все настройки происходят в php массиве, настройте его по примеру ниже и получите готовый фид.
Get feed content:
<?php // Example data, is managed from array $name = 'Feed Php'; // Название фида $company = 'Php'; // Название вашей компании $url = 'https://php.ru'; // Url вашего сайта // Пример категории для фида $categories = [ [ 'id' => 1, 'name' => 'cat1', ], [ 'id' => 2, 'name' => 'cat2', 'parent_id' => 1 ], ]; // Пример офферов для фида $offers = [ [ // Настраиваем тег offer 'id' => 77, // id в offer 'attrs' => ['available' => true], // атрибуты в offer массивом, ключ значение 'attrsOnlyKey' => ['name'], // атрибуты только ключи массивом // Настраиваем теги в offer, обязательный параметр только tag 'tags' => [ [ 'tag' => 'barcode', // название тега 'value' => '123', // значение тега 'attrs' => ['one' => 1], // атрибуты в теге, ключ значение 'attrsOnlyKey' => ['data_name'], // атрибуты в теге, только ключи 'end' => true, // удалить закрывающий тег 'endSlash' => false, // добавить слеш в конце тега 'checkSpecialCharset' => true, // проверка на недопустимые символы и если есть выводим в значение в конструкции CDATA, т.е. экранируем 'cdata' => true, // всегда экранировать значение 'stripTags' => true, // удалить из значения html теги 'numberFormat' => true, // преобразуем число в строку с форматом без лишних нулей в конце 'implodeArr' => true, // если значение состоит из массива значений, то разбиваем вертикальной чертой каждое значение 'implodeJson' => true, // если значение json массив значений, то разбиваем вертикальной чертой каждое значение 'skipIfEmpty' => true, // если значение пустое не отображаем тег ], [ 'tag' => 'price', 'value' => '777', ], ], // Настраиваем теги params, обязательный параметр только name 'params' => [ [ 'name' => 'weight', 'value' => '11', 'unit' => 'kg', // единицы измерения 'attrs' => ['two' => 2], 'attrsOnlyKey' => ['data_name'], 'skipIfEmpty' => true, // если значение пустое не отображаем параметр ], [ 'name' => 'height', 'value' => '11', ], ], // Если нужно вывести особый тег, добавьте сюда 'customs' => [ 'you_tag_1', 'you_tag_2', ], ], ]; // Get content feed $feedTemplate = new TemplateFeed($name, $company, $url, $categories, $offers); $feed = $feedTemplate->content('RUR'); // Здесь используется шаблон из класса TemplateFeed, если данный шаблон не подходит, то создайте свой класс по данному примеру, обязательно реализуйте метод content, например класс: \App\Feed\TemplateFeed.
Поля name, company, url и названия категорий экранируются автоматически (метод BuilderFeed::escape()). Передавайте в них сырые данные — не экранируйте заранее, иначе получите двойное экранирование. Метод escape() публичный, его можно использовать и для своих значений.
Если вы используете Laravel, то сохранение будет через Storage helper, иначе фид сохранится через file_put_contents
Generate feed and save:
<?php GenerateFeed::run( $name, $company, $url, $categories, $offers, $putPath, // путь для сохранения фида $disk, // для Laravel можно передать имя диска, необязательный параметр $currencyId, // по-умолчанию RUR, можно передать любую другую валюту $customClassTemplateFeed // по-умолчанию встроенный шаблон, можно передать название своего класса шаблона фида, например: \App\Feed\TemplateFeed::class );
Сохранение фида вынесено в отдельные writer-классы (Writers/FileWriter, Writers/LaravelStorageWriter). По-умолчанию обработчик определяется автоматически: Laravel Storage, если доступен, иначе file_put_contents. При необходимости можно передать свой обработчик последним аргументом (реализует Writers\FeedWriterInterface):
GenerateFeed::run($name, $company, $url, $categories, $offers, $putPath, null, 'RUR', null, new MyCustomWriter());
Метод GenerateFeed::run() теперь возвращает сгенерированный контент фида (строку), что не влияет на существующие вызовы.
Для больших фидов и S3 используйте потоковый writer (запись во временный файл + Storage::writeStream, multipart upload, меньше памяти на заливке):
use Dimitriytiho\FeedBuilderKd\Feeds\Writers\LaravelStorageStreamWriter; GenerateFeed::run($name, $company, $url, $categories, $offers, $putPath, $disk, 'RUR', null, new LaravelStorageStreamWriter($disk));
Рекомендуемый вариант — порог-writer: до 50МБ прямой put(), больше — потоковая заливка. Порог настраивается вторым аргументом (байты):
use Dimitriytiho\FeedBuilderKd\Feeds\Writers\LaravelStorageThresholdWriter; GenerateFeed::run($name, $company, $url, $categories, $offers, $putPath, $disk, 'RUR', null, new LaravelStorageThresholdWriter($disk)); // свой порог, например 100МБ: new LaravelStorageThresholdWriter($disk, 100 * 1024 * 1024)
Если вам не подходит данное решение через GenerateFeed::run вы можете по данному примеру создать свой класс и делать с контентом фида всё что угодно.
JSON-фид (NDJSON / JSON Lines)
Отдельный путь генерации, не связанный с XML. Формат — NDJSON: один JSON-объект на строку.
- строка 1 — заголовок-обёртка:
{ "name", "company"?, "url"?, "currencyId"?, "date", "categories"? }(обязателен толькоname, опциональные поля попадают в вывод только если переданы непустыми;dateподставляется автоматически); - строки 2..N — по одному товару на строку.
Экранирование выполняет json_encode с флагами JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES — кириллица читаемая, слеши в URL не экранируются.
Формат offer() для JSON — плоский ассоциативный массив (без XML-понятий: тегов, атрибутов, CDATA, numberFormat). Типы сохраняются как есть (числа, bool, вложенные массивы):
[
'id' => 100,
'name' => 'Кабель «Люкс»',
'url' => 'https://site.ru/p/100',
'price' => 1234.5,
'available' => true,
'categoryId' => 5,
'params' => ['Вес' => 1.5, 'Цвет' => 'белый'],
]
Память: $offers принимается как iterable (массив, генератор, LazyCollection/cursor), строки пишутся потоково во временный файл. Заливка с тем же порогом: файл меньше 50МБ (параметр thresholdBytes) уходит прямым put(), больше — стримом (Storage::writeStream, multipart на S3) — весь фид в памяти не накапливается.
use Dimitriytiho\FeedBuilderKd\Feeds\GenerateJsonFeed; GenerateJsonFeed::run( name: 'Json Php', // обязательно offers: $offersIterable, // массив или генератор плоских массивов categories: $categories, putPath: 'feed/1/feed.ndjson', disk: 's3files', // Laravel-диск; без Laravel — пишется в файл по putPath company: $company, url: $url, currencyId: 'RUR', );
Команда обновления пакета
composer update dimitriytiho/feed-builder-kd
dimitriytiho/feed-builder-kd 适用场景与选型建议
dimitriytiho/feed-builder-kd 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 407 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 08 月 15 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「xml」 「feed」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 dimitriytiho/feed-builder-kd 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 dimitriytiho/feed-builder-kd 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 dimitriytiho/feed-builder-kd 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Simple RSS generator library for PHP 5.5 or later. clone from Bhaktaraz Bhatta ttps://github.com/bhaktaraz/php-rss-generator
Load DOM document safety
Added a method to Laravel response for handling xml response and also converting Eloquent return to XML.
Google Shopping Feed API (with ns problem fixed)
Uses reflection to map XML to PHP objects.
Xml Template Engine
统计信息
- 总下载量: 407
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 20
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: ISC
- 更新时间: 2025-08-15