← Предыдущая · Назад к 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 и так далее.
Полный пример
Используйте рецепт «Несколько целевых файлов фида»: в нём приведены полный класс фида, команды генерации и ожидаемые пути.