Перейти к основному содержимому

← Предыдущая · Назад к README · Следующая →

Отдельные файлы для партнёров, магазинов и локалей

Используйте цели фида, когда один зарегистрированный фид должен создавать отдельный отфильтрованный файл для каждого партнёра, магазина, локали или другого бизнес-ключа.

Выбор типа разделения

Фразы «разбивка на файлы» и «разделение на файлы» могут описывать два разных механизма:

ЗадачаЧто использовать
Отдельный отфильтрованный вывод для каждого партнёра, магазина, локали или другого бизнес-ключаHasFeedTargets и FeedTarget
Последовательные части с фиксированным количеством записей в каждом файлеperFile() и при необходимости maxFiles()
Отдельные варианты вывода, каждый из которых может состоять из нескольких частейЦели фида вместе с perFile()

Цели фида разделяют данные по смыслу, заданному приложением. perFile() делит уже выбранный набор данных по количеству записей.

Как работают цели фида

В таблице feeds по-прежнему хранится одна строка для класса фида. Каждый FeedTarget описывает один вариант вывода со стабильным ключом и небольшим снимком параметров.

Реализуйте HasFeedTargets в классе фида. Встроенный трейт InteractsWithFeedTargets предоставляет forTarget() и target(), а класс фида реализует перечисление и поиск:

МетодОтветственность
targets(): iterableЛениво возвращает все доступные варианты вывода для полного запуска командой или по расписанию.
findTarget(string $key): ?FeedTargetНаходит явно запрошенный ключ --target или возвращает null.
forTarget(FeedTarget $target): staticВозвращает настроенный клон фида.
target(): FeedTargetВозвращает активную цель внутри builder(), filename() и других хуков выполнения.

FeedTarget::$key должен быть непустым, стабильным, уникальным в пределах класса фида и безопасным для вывода. Ключи не нормализуются и не очищаются. Они отображаются в консоли, JSON для агента, событиях и контексте ошибки.

FeedTarget::$parameters — управляемый приложением снимок данных, который сохраняется в заданиях очереди. Он должен быть небольшим, сериализуемым и не содержать секретов. Храните идентификаторы вместо моделей Eloquent.

предупреждение

Каждая цель должна разрешаться в отдельное имя выходного файла. Иначе следующая цель перезапишет предыдущий вывод. Используйте ключ цели в пути, только если приложение контролирует его формат.

Генерация выходных файлов

Сгенерируйте все цели, возвращённые targets():

php artisan feed:generate 123

Сгенерируйте одну или несколько выбранных целей:

php artisan feed:generate 123 --target=42
php artisan feed:generate 123 --target=42 --target=81

Явно заданные ключи используют findTarget() вместо перечисления targets(). Повторяющиеся ключи обрабатываются один раз в порядке первого появления. Все запрошенные ключи разрешаются до начала генерации.

Полное перечисление выполняется потоково, а не атомарно. Если targets() завершится ошибкой после возврата нескольких значений, предыдущие цели уже могут быть сгенерированы или поставлены в очередь. Запуск по расписанию генерирует все цели, а режим очереди отправляет отдельное задание для каждой цели.

Обычное разделение по количеству записей применяется отдельно для каждой цели. Например, partners/42.xml превращается в partners/42-1.xml, partners/42-2.xml и так далее.

Полный пример

Используйте рецепт «Несколько целевых файлов фида»: в нём приведены полный класс фида, команды генерации и ожидаемые пути.

Смотрите также