dimitriytiho/feed-builder-kd 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

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 我们能提供哪些服务?
定制开发 / 二次开发

基于 dimitriytiho/feed-builder-kd 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 407
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 20
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: ISC
  • 更新时间: 2025-08-15